/*
 * GeneradorCodigoFuente.java
 *
 * Copyright 2011 Universidad Francisco de Paula Santander (UFPS).
 * Todos los Derechos Reservados.
 * Creado el 24/02/2011, 11:23:38 AM
 */

package com.ufps.cuatro.util.generadores;

import java.awt.Color;
import java.awt.GridBagConstraints;
import java.io.BufferedWriter;
import java.io.File;
import java.io.InputStream;
import java.io.OutputStreamWriter;
import java.io.PrintStream;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Properties;
import java.util.logging.Level;
import java.util.logging.Logger;

import org.apache.velocity.Template;
import org.apache.velocity.VelocityContext;
import org.apache.velocity.app.VelocityEngine;
import org.apache.velocity.exception.ParseErrorException;
import org.apache.velocity.exception.ResourceNotFoundException;

import com.ufps.cuatro.controlador.render.UtilRender;
import com.ufps.cuatro.modelo.old.ComponenteBeans;
import com.ufps.cuatro.modelo.representacion.EventoOyente;
import com.ufps.cuatro.modelo.representacion.ModeloAsociado;
import com.ufps.cuatro.modelo.representacion.ObjetoTipoDatoReflexion;
import com.ufps.cuatro.modelo.representacion.Oyente;
import com.ufps.cuatro.modelo.representacion.ParametroPropiedad;
import com.ufps.cuatro.modelo.representacion.Propiedad;
import com.ufps.cuatro.modelo.representacion.PropiedadBeans;
import com.ufps.cuatro.modelo.representacion.TipoColeccionModeloAsociado;
import com.ufps.cuatro.modelo.representacion.UtilRepresentacion;
import com.ufps.cuatro.modelo.representacion.componente.Componente;
import com.ufps.cuatro.modelo.representacion.componente.ComponenteDistribuidor;
import com.ufps.cuatro.modelo.representacion.componente.ComponenteDistribuidorContenedor;
import com.ufps.cuatro.modelo.representacion.componente.ComponenteDistribuidorContenedorEspejo;
import com.ufps.cuatro.modelo.representacion.componente.ComponenteDistribuidorExtra;
import com.ufps.cuatro.modelo.representacion.componente.ComponenteDistribuidorGenerador;
import com.ufps.cuatro.modelo.representacion.componente.ComponenteDistribuidorGeneradorClaseCompleja;
import com.ufps.cuatro.modelo.representacion.componente.ComponenteDistribuidorGeneradorEnum;
import com.ufps.cuatro.modelo.representacion.componente.ComponenteDistribuidorGeneradorMetodo;
import com.ufps.cuatro.modelo.representacion.componente.ComponenteDistribuidorGeneradorMetodoGetter;
import com.ufps.cuatro.modelo.representacion.componente.ComponenteDistribuidorGeneradorMetodoSetter;
import com.ufps.cuatro.modelo.representacion.componente.ComponenteDistribuidorGeneradorUnitario;
import com.ufps.cuatro.modelo.representacion.componente.ComponenteDistribuidorIntegrador;
import com.ufps.cuatro.modelo.representacion.componente.ComponenteDistribuidorIntegradorExtra;
import com.ufps.cuatro.modelo.representacion.componente.ComponenteDistribuidorIntegradorMetodo;
import com.ufps.cuatro.modelo.representacion.componente.ComponenteDistribuidorIntegradorSimple;
import com.ufps.cuatro.modelo.representacion.componente.ComponenteDistribuidorModeloAsociado;
import com.ufps.cuatro.modelo.representacion.componente.ComponenteGenerado;
import com.ufps.cuatro.modelo.representacion.componente.ComponenteGeneradoInterno;
import com.ufps.cuatro.modelo.representacion.componente.ComponenteGeneradoSimple;
import com.ufps.cuatro.util.TipoCaso;
import com.ufps.cuatro.util.Utileria;
import com.ufps.cuatro.util.base.CastTipoDatoRepresentacionBase;
import com.ufps.cuatro.util.base.PropiedadBase;
import com.ufps.cuatro.util.generadores.codeobject.CodeContextClass;
import com.ufps.cuatro.util.generadores.codeobject.EnumTypeCodeSyntax;
import com.ufps.cuatro.util.model.MyMap;
import com.ufps.cuatro.util.opciones.MyPreferences;
import com.ufps.cuatro.util.opciones.UtilOpciones;
import java.io.IOException;

/**
 * <i><b>GeneradorCodigoFuente:</b></i><p>Esta Clase es el Generador de Códigpo 
 * Fuente de la Aplicación. Basa su generacion de código en el Motor de Plantillas
 * Velocity de Apache bajo una Biblioteca de Plantillas previamente generadas
 * que corresponden a cada tipo de representación de archivo generada en los
 * análisis.</p>
 * 
 * @author Carlos A. Torres C. - Dolly E. Guerrero. <https://code.google.com/p/tesis4dor/>
 * @version 1.0 24/02/2011
 */
public abstract class GeneradorCodigoFuente {   
    
    /**
     * Define un Sub - nivel de Agrupación en la Estructuración de la Interfaz
     * Gráfica. <code>Ej: Paquete com.ufps.cuatro.modelo;</code> ó un elemento perteneciente
     * a un objeto Java. <code>Ej clase: x.getInt();</code>.
     */
    public final static String TOKEN_PUNTO = ".";
    /**
     * Define el inicio de un bloque de Procesamiento de Código.
     */
    public final static String TOKEN_ABRIR_BLOQUE = "{";
    /**
     * Define el final de un bloque de Procesamiento de Código.
     */
    public final static String TOKEN_CERRAR_BLOQUE = "}";
    /**
     * Define parentesis vacios para un método, constructor ó prioridad
     * en una secuencia de una sentencia de código.
     */
    public final static String TOKEN_PARENTESIS_BEANS = "()";
    /**
     * Define el final y salto de linea en una sentencia de Código.
     */
    public final static String TOKEN_FIN_LINEA = ";\n";
    /**
     * Define la Plantilla por Defecto para los <code>ComponenteDistribuidorContenedor</code>.
     */
    public final static String KEY_DEFAULT_PLANTILLA_CONTENEDOR = "Utileria.template.frame";
    /**
     * Define el nombre genrico para lap lantilla de los contenedores.
     */
    public final static String KEY_DEFAULT_PLANTILLA_VELOCITY_CONTENEDOR = "Utileria.template.velocity.panel";
    /**
     * Define la Plantilla por Defecto para los <code>ComponenteIntegrador</code>.
     */
    public final static String KEY_DEFAULT_PLANTILLA_INTEGRADOR = "Utileria.template.panel";
    /**
     * Define el nombre del archivo de propiedades por defecto.
     */
    public final static String KEY_DEFAULT_VELOCITY_PROPERTIES = "Utileria.config.velocity.default";    
    /**
     * Define el Tipo de Codificación Generado en los Archivos de Código Fuente.
     */
    public final static String ENCODING_SOURCE = "UTF-8";
    /**
     * Indice de Generación de Artefacto en la Sesión Actual.
     */
    public static int id = 0;
    
    /**
     * Genera el Código Fuente del Proyecto actual.
     * @param objCFG Objeto Global de Configuración de Generación de Proyecto.
     * @return boolean que determina el resultado del proceso.
     */
    public static boolean generateProject(ConfiguracionGeneradorCodigo objCFG){
        try{   
            //Configurando Almacenamiento de Recursos.
            if(objCFG.addResourcesToProject){//Inlucir Recursos en el Modelo
                if(UtilRepresentacion.objBibliotecaTrabajoLocal.existsResourcesImage()){                    
                    ArrayList<ComponenteGenerado> objComponentes = 
                            UtilRepresentacion.objBibliotecaTrabajoLocal.getComponentesWithResourceImage();                        
                    if(!objComponentes.isEmpty()){//Existen Componentes con Recursos.                    
                        GeneradorCodigoFuente.buildPathSourceFileProperties(objComponentes);
                    }                                
                }
            }            
            
            if(UtilRepresentacion.objBibliotecaTrabajoLocal.isIncludedComponenteContenedor()){
                for(ComponenteDistribuidorContenedor objComponenteDistribuidorContenedor : UtilRepresentacion.objBibliotecaTrabajoLocal.getObjComponentesContenedores()){                
                    if(!generateCodeMap(objComponenteDistribuidorContenedor, objCFG)){                    
                        return false;
                    }                
                }
            }
            else if(UtilRepresentacion.objBibliotecaTrabajoLocal.isIncludedComponenteIntegrador()){
                for(ComponenteDistribuidorIntegrador objComponenteDistribuidorIntegrador : UtilRepresentacion.objBibliotecaTrabajoLocal.getObjComponentesIntegradores()){                
                    if(!generateCodeMap(objComponenteDistribuidorIntegrador, objCFG)){                    
                        return false;
                    }                
                }                
            }
            else if(UtilRepresentacion.objBibliotecaTrabajoLocal.isIncludedComponenteGenerador()){
                for(ComponenteDistribuidorGenerador objComponenteDistribuidorgenerador : UtilRepresentacion.objBibliotecaTrabajoLocal.getObjComponentesGeneradores()){                
                    if(!generateCodeMap(objComponenteDistribuidorgenerador, objCFG)){                    
                        return false;
                    }                
                }
            }
            return true;
        }catch(java.lang.NullPointerException ex){
            UtilRender.msgError(ex.getMessage(), true);
        }
        return false;
    }   
    
    private static boolean incluirRecursos(ConfiguracionGeneradorCodigo objCFG, ArrayList<ComponenteGenerado> objComponentes){
        String strPath = objCFG.strPathProyecto;// + Utileria.separador + objCFG.strNombreProyecto;// + Utileria.separador + "resources";
        File objFile = new File(strPath);        
//        try{
//            if(objFile.exists()){//Elimina cualquier recurso previo agregado.              
//                Utileria.BorrarDirLocal(objFile);
//                objFile.delete();                
//            }
//        }catch(SecurityException ex){
//            UtilRender.msgAdvertencia("No puede sobreescribir el Directorio. Existen archivos en uso.");
//            UtilRender.printlnConsole("Error de Seguridad.", ex.getMessage(), UtilRender.ACTION_ERROR);
//        }        
        try{
            if(objFile.isDirectory()){//Crea el nuevo directorio.
                for(ComponenteGenerado objComponente : objComponentes){
                    String strPackage = (String) objComponente.getObjSwapValues().get("package");
                    String strPathPackage = strPath + Utileria.separador + Utileria.getStrPaqueteToFile(strPackage);
//                    File objFileComponente = new File(strPathPackage);
//                    if(!objFileComponente.exists()){//Confirma si el directorio existe, si no lo crea
//                        objFileComponente.mkdir();
//                    }
                    Propiedad objPropiedad = objComponente.findPropiedadForAlias("Icono");
                    ParametroPropiedad objParametro = objPropiedad.getObjParametroDefault(Propiedad.MODO_SET);
                    if(objParametro.getStrValue() != null){//confirma la existencia del path
                       if(!objParametro.getStrValue().isEmpty() &&
                               Utileria.getExecuteMode() == Utileria.SourceCodeMode &&
                               objPropiedad.isSwapKey(Propiedad.NAME_PROPERTIES_ICON) && 
                               objComponente.isSwapKey("package")){//que este vacio
                           String strPathFileImage = objParametro.getStrValue();
                           File objFileImage = new File(strPathFileImage);
                           String nameImage = objFileImage.getName();
                           String strNewPathFileImage = strPathPackage + Utileria.separador + nameImage;//creo el nuevo destino                            
                           //creo el nuevo destino 
                           try {
                               Utileria.copia(objFileImage, strNewPathFileImage);//copia el archivo                               
                           } catch (IOException ex) {
                               UtilRender.msgAdvertencia("No puede crear el Recurso: " + nameImage
                                       + "\nCompruebe que el archivo no este en uso.");
                               UtilRender.printlnConsole("Error de Seguridad.", ex.getMessage(), UtilRender.ACTION_ERROR);
                           }
                       } 
                    }
                }
            } 
            else{
                UtilRender.msgAdvertencia("No se pueden agregar los recursos, el Directorio No existe.");
            }
            return true;
        }catch(SecurityException ex){
            UtilRender.msgAdvertencia("No puede crear el Directorio. Existen archivos en uso.");
            UtilRender.printlnConsole("Error de Seguridad.", ex.getMessage(), UtilRender.ACTION_ERROR);
        }
        return false;
    }
    
    public static boolean actualizarPathRecursos(ConfiguracionGeneradorCodigo objCFG, ArrayList<ComponenteGenerado> objComponentes){        
        try{
            for(ComponenteGenerado objComponente : objComponentes){
                String strPackage = (String) objComponente.getObjSwapValues().get("package");            
                Propiedad objPropiedad = objComponente.findPropiedadForAlias("Icono");
                ParametroPropiedad objParametro = objPropiedad.getObjParametroDefault(Propiedad.MODO_SET);
                if(objParametro.getStrValue() != null){//confirma la existencia del path
                   if(!objParametro.getStrValue().isEmpty()){//que este vacio
                       String strPathFileImage = objParametro.getStrValue();
                       File objFileImage = new File(strPathFileImage);
                       String nameImage = objFileImage.getName();//obtengo el nombre del recurso                   
                       String strNewPathImage = "resources" + Utileria.separador + Utileria.getStrPaqueteToFile(strPackage)
                               + Utileria.separador + nameImage;
                       objParametro.setStrValue(strNewPathImage);                   
                   } 
                }
            }
            return true;
        }catch(Exception ex){            
            UtilRender.printlnConsole("Error al Copiar los Recursos al Proyecto: ", ex.getMessage(), UtilRender.ACTION_ERROR);
        }
        return false;
    } 
    
    
    /**
     * Genera el mapa de Código Fuente que representa el contenedor y su contenido.
     * @param objComponenteDistribuidorParent Contenedor al cual se le generará el
     * código Fuente.
     * @param objCFG Objeto Global de Configuración de Generación de Proyecto.
     * @return boolean que determina el resultado del proceso.
     */
    public static boolean generateCodeMap(ComponenteDistribuidor objComponenteDistribuidorParent, ConfiguracionGeneradorCodigo objCFG){              
        try{
            if(objComponenteDistribuidorParent instanceof ComponenteDistribuidorContenedor){
                generateCodeMapComponenteContenedor(objComponenteDistribuidorParent, objCFG);                
            }
            else if(objComponenteDistribuidorParent instanceof ComponenteDistribuidorIntegrador){                
                generateCodeMapComponenteIntegrador(objComponenteDistribuidorParent, objCFG);
            }            
            else if(objComponenteDistribuidorParent instanceof ComponenteDistribuidorGeneradorClaseCompleja){
                generateCodeMapComponenteGeneradorClaseCompleja(objComponenteDistribuidorParent, objCFG);
            }
            else if(objComponenteDistribuidorParent instanceof ComponenteDistribuidorModeloAsociado){
                generatorSourceCode((ComponenteDistribuidorModeloAsociado) objComponenteDistribuidorParent, objCFG);                
                for(Componente objComponente : objComponenteDistribuidorParent.getComponentesDistribuidos()){
                    if(objComponente instanceof ComponenteDistribuidor){
                        generateCodeMap((ComponenteDistribuidor)objComponente, objCFG);
                    }
                }
            }
            else{
                GeneradorCodigoFuente.generatorSourceCode(objComponenteDistribuidorParent, objCFG);
            }
            return true;
        }catch(java.lang.Exception ex){            
            Logger.getLogger(GeneradorCodigoFuente.class.getName()).log(Level.SEVERE, null, ex);
        }
        return false;
    }

    private static void generateCodeMapComponenteGeneradorClaseCompleja(ComponenteDistribuidor objComponenteDistribuidorParent, ConfiguracionGeneradorCodigo objCFG) {
        GeneradorCodigoFuente.generatorSourceCode(objComponenteDistribuidorParent, objCFG);
        for(Componente objComponente : objComponenteDistribuidorParent.getComponentesDistribuidos()){
            if(objComponente instanceof ComponenteDistribuidorGeneradorClaseCompleja){
                GeneradorCodigoFuente.generatorSourceCode((ComponenteDistribuidor)objComponente, objCFG);
            }
        }
    }

    private static void generateCodeMapComponenteIntegrador(ComponenteDistribuidor objComponenteDistribuidorParent, ConfiguracionGeneradorCodigo objCFG) {
        GeneradorCodigoFuente.generatorSourceCode(objComponenteDistribuidorParent, objCFG);
        for(Componente objComponente : objComponenteDistribuidorParent.getComponentesDistribuidos()){
            if(objComponente instanceof ComponenteDistribuidorGeneradorClaseCompleja){
                generateCodeMap((ComponenteDistribuidor)objComponente, objCFG);
            }
        }
    }

    private static void generateCodeMapComponenteContenedor(ComponenteDistribuidor objComponenteDistribuidorParent, ConfiguracionGeneradorCodigo objCFG) {        
        generatorSourceCode((ComponenteDistribuidorContenedor) objComponenteDistribuidorParent, objCFG);
        for(Componente objComponente : objComponenteDistribuidorParent.getComponentesDistribuidos()){
            if(objComponente instanceof ComponenteDistribuidorIntegrador){
                generateCodeMap((ComponenteDistribuidor)objComponente, objCFG);
            }
        }
    }    

    private static void crearModeloAsociado(ComponenteDistribuidor objComponenteDistribuidor, ConfiguracionGeneradorCodigo objCFG) {
        if(objComponenteDistribuidor instanceof ComponenteDistribuidorExtra){
            ComponenteDistribuidorExtra objComponenteExtra = (ComponenteDistribuidorExtra) objComponenteDistribuidor;
            if(objComponenteExtra.isIntoCasoColeccion()){                    
                GeneradorCodigoFuente.generarCodigoModeloAsociado(objComponenteExtra.getObjModeloAsociado(), objCFG);                    
            }        
        }
        else if(objComponenteDistribuidor instanceof ComponenteDistribuidorGeneradorUnitario){
            ComponenteDistribuidorGeneradorUnitario ComponenteGeneradorUnitario = (ComponenteDistribuidorGeneradorUnitario) objComponenteDistribuidor;
            if(ComponenteGeneradorUnitario.isIntoCasoColeccion()){                    
                GeneradorCodigoFuente.generarCodigoModeloAsociado(ComponenteGeneradorUnitario.getObjModeloAsociado(), objCFG);                    
            }        
        }
    }
    
    private static VelocityEngine startVelocityEngine(){        
        try {
            InputStream in = GeneradorCodigoFuente.class.getResourceAsStream(Utileria.leerRecursoTexto(KEY_DEFAULT_VELOCITY_PROPERTIES));
            Properties objConfig = new Properties();
            objConfig.load(in);
            VelocityEngine objVelocityEngine = new VelocityEngine();
            objVelocityEngine.init(objConfig);
            return objVelocityEngine;
        } catch (Exception ex) {
            Logger.getLogger(GeneradorCodigoFuente.class.getName()).log(Level.SEVERE, null, ex);
        } 
        return null;
    }
    
    private static void loadConfigInitContextContenedorFrame(VelocityContext context, ComponenteDistribuidorContenedor objComponenteDistribuidorContenedor, ConfiguracionGeneradorCodigo objCFG){
        context.put("Componente", objComponenteDistribuidorContenedor);
        context.put("nombre_clase_formulario", objComponenteDistribuidorContenedor.getName());
        context.put("titulo", objComponenteDistribuidorContenedor.getStrTitulo());
        context.put("user", objCFG.strUsuario);
        context.put("date", objCFG.fecha.toString());      
        context.put("principal", objComponenteDistribuidorContenedor.isMain());              
        context.put("package", objComponenteDistribuidorContenedor.getStrPaquete());        
    }    
    
    private static void loadConfigInitContextDialogModeloAsociado(VelocityContext context, ComponenteDistribuidorModeloAsociado objComponenteDistribuidorModeloAsociado, ConfiguracionGeneradorCodigo objCFG){
        context.put("Componente", objComponenteDistribuidorModeloAsociado);
        context.put("nombre_clase", objComponenteDistribuidorModeloAsociado.getName());
        context.put("titulo", "Captura de " + objComponenteDistribuidorModeloAsociado.getObjComponenteDistribuidorObject().getName());
        context.put("user", objCFG.strUsuario);
        context.put("date", objCFG.fecha.toString());      
        context.put("classpathpanel", objComponenteDistribuidorModeloAsociado.getObjComponenteDistribuidorObject().getName());      
        context.put("objpanel", "obj" + objComponenteDistribuidorModeloAsociado.getObjComponenteDistribuidorObject().getName());        
        
        ComponenteDistribuidor objComponenteDistribuidor = objComponenteDistribuidorModeloAsociado.getObjComponenteDistribuidorObject();
        
        if(objComponenteDistribuidor instanceof ComponenteDistribuidorGenerador){
            ComponenteDistribuidorGenerador objComponenteDistribuidorGenerador = (ComponenteDistribuidorGenerador) objComponenteDistribuidor;
            context.put("classpathobj", objComponenteDistribuidorGenerador.getObjTipoDato().getStrClassPath());
            context.put("obj", objComponenteDistribuidorGenerador.getObjTipoDato().getStrNombre());
        }
        else if(objComponenteDistribuidor instanceof ComponenteDistribuidorExtra){
            ComponenteDistribuidorExtra objComponenteDistribuidorExtra = (ComponenteDistribuidorExtra) objComponenteDistribuidor;
            ComponenteBeans objComponenteBeans = objComponenteDistribuidorExtra.getObjComponenteBeans();
            context.put("classpathobj", objComponenteBeans.getName());
            context.put("obj", objComponenteBeans.getName());            
        }               
        context.put("package", objComponenteDistribuidorModeloAsociado.getStrPaquete());        
    }    
    
    private static void loadConfigInitContextComponenteBeans(VelocityContext context, ComponenteBeans objComponenteBeans, ConfiguracionGeneradorCodigo objCFG){
        context.put("Componente", objComponenteBeans);
        context.put("name", objComponenteBeans.getName());
        context.put("user", objCFG.strUsuario);
        context.put("date", objCFG.fecha.toString());      
        context.put("package", objComponenteBeans.getObjComponenteDistribuidor().getStrPaquete() + "." + objComponenteBeans.getStrPackage());
    }
    
    
    private static void loadConfigInitContextComponenteDistribuidor(VelocityContext context, ComponenteDistribuidor objComponenteDistribuidor, ConfiguracionGeneradorCodigo objCFG){
        context.put("Componente", objComponenteDistribuidor);
        context.put("nombre_clase_panel", objComponenteDistribuidor.getName());
        context.put("user", objCFG.strUsuario);
        context.put("date", objCFG.fecha.toString());      
        context.put("package", objComponenteDistribuidor.getStrPaquete());
        
        ArrayList<String> objDefinicionesModelos = new ArrayList<String>();
        ArrayList<String> objFuncionesModelos = new ArrayList<String>();
        
        if(objComponenteDistribuidor instanceof ComponenteDistribuidorIntegrador){
            context.put("titulo", objComponenteDistribuidor.getStrTitulo());                        
            GeneradorCodigoFuente.encapsularDefinicionesModelosAsociados(objDefinicionesModelos, objFuncionesModelos, objComponenteDistribuidor.getComponentesDistribuidos());            
            if(!objDefinicionesModelos.isEmpty() && !objFuncionesModelos.isEmpty()){
                context.put("DefinicionesModelosComponentes", objDefinicionesModelos);                                    
                context.put("DefinicionesFuncionesModelosComponentes", objFuncionesModelos);
            }
        }
        else if(objComponenteDistribuidor instanceof ComponenteDistribuidorGeneradorClaseCompleja){
            context.put("titulo", objComponenteDistribuidor.getStrTitulo());            
            GeneradorCodigoFuente.encapsularDefinicionesModelosAsociados(objDefinicionesModelos, objFuncionesModelos, objComponenteDistribuidor.getComponentesDistribuidos());            
            if(!objDefinicionesModelos.isEmpty() && !objFuncionesModelos.isEmpty()){
                context.put("DefinicionesModelosComponentes", objDefinicionesModelos);                                    
                context.put("DefinicionesFuncionesModelosComponentes", objFuncionesModelos);
            }
        }
        else if(objComponenteDistribuidor instanceof ComponenteDistribuidorExtra){
            ComponenteDistribuidorExtra objComponenteExtra = (ComponenteDistribuidorExtra) objComponenteDistribuidor;
            if(objComponenteExtra.getObjModeloAsociado() != null){
                ModeloAsociado objModeloAsociado = objComponenteExtra.getObjModeloAsociado();
                if(objModeloAsociado.geteTipoColeccion() == TipoColeccionModeloAsociado.eAbstractList){
                }
            }
        }
        else if(objComponenteDistribuidor instanceof ComponenteDistribuidorGeneradorUnitario){
            ComponenteDistribuidorGeneradorUnitario objComponenteGeneradorUnitario = (ComponenteDistribuidorGeneradorUnitario) objComponenteDistribuidor;
            if(objComponenteGeneradorUnitario.getObjModeloAsociado() != null){
                ObjetoTipoDatoReflexion objTipoDato = objComponenteGeneradorUnitario.getObjTipoDato();
                ModeloAsociado objModeloAsociado = objComponenteGeneradorUnitario.getObjModeloAsociado();
                if(objModeloAsociado.geteTipoColeccion() == TipoColeccionModeloAsociado.eAbstractList){                    
                    ComponenteGeneradoInterno objComponenteGeneradoInterno = objComponenteGeneradorUnitario.getObjComponenteGenerador();
                    String strClassPath = objTipoDato.getStrClassPath();
                    if(objTipoDato.contieneRepresentacionesGenericas()){
                        strClassPath += objTipoDato.getClassTypesGeneric(false);
                    }
                    else{                        
                        strClassPath += "<" + objComponenteGeneradoInterno.getObjPropiedadBeans().getStrClassPathParametroDefaul() + ">";
                    }
                    context.put("varModel", "private " + strClassPath + " objColeccion = new " + strClassPath + "();\n");                    
                    context.put("funcModel", "public " + strClassPath + " devolverColeccion(){\n" + 
                            "return objColeccion;}");                    
                }
            }
        }  
    }
    
    private static void encapsularDefinicionesModelosAsociados(ArrayList<String> objDefinicionesModelos, ArrayList<String> objFuncionesModelos, ArrayList<Componente> objComponentesDistribuidos){
        for(Componente objComponente : objComponentesDistribuidos){
            if(objComponente instanceof ComponenteDistribuidorGeneradorUnitario){
                ComponenteDistribuidorGeneradorUnitario objComponenteGeneradorUnitario = (ComponenteDistribuidorGeneradorUnitario) objComponente;
                encapsularDefinicionesModeloAsociadoComponente(objComponenteGeneradorUnitario, objDefinicionesModelos, objFuncionesModelos);
            }
            else if(objComponente instanceof ComponenteDistribuidorGeneradorMetodoSetter){
                ComponenteDistribuidorGeneradorMetodoSetter objComponenteDistribuidorGeneradorMetodoSetter = (ComponenteDistribuidorGeneradorMetodoSetter) objComponente;
                if(objComponenteDistribuidorGeneradorMetodoSetter.getObjComponenteGeneradorParam() instanceof ComponenteDistribuidorGeneradorUnitario){
                    ComponenteDistribuidorGeneradorUnitario objComponenteGeneradorUnitarioParam = (ComponenteDistribuidorGeneradorUnitario) objComponenteDistribuidorGeneradorMetodoSetter.getObjComponenteGeneradorParam();
                    encapsularDefinicionesModeloAsociadoComponente(objComponenteGeneradorUnitarioParam, objDefinicionesModelos, objFuncionesModelos);
                }
            }
            else if(objComponente instanceof ComponenteDistribuidorGeneradorMetodoGetter){
                ComponenteDistribuidorGeneradorMetodoGetter objComponenteDistribuidorGeneradorMetodoGetter = (ComponenteDistribuidorGeneradorMetodoGetter) objComponente;
                if(objComponenteDistribuidorGeneradorMetodoGetter.getObjComponenteGeneradorReturn() instanceof ComponenteDistribuidorGeneradorUnitario){
                    ComponenteDistribuidorGeneradorUnitario objComponenteGeneradorUnitarioParam = (ComponenteDistribuidorGeneradorUnitario) objComponenteDistribuidorGeneradorMetodoGetter.getObjComponenteGeneradorReturn();
                    encapsularDefinicionesModeloAsociadoComponente(objComponenteGeneradorUnitarioParam, objDefinicionesModelos, objFuncionesModelos);
                }
            }
        }                    
    }
    
    private static void encapsularDefinicionesModeloAsociadoComponente(ComponenteDistribuidorGeneradorUnitario objComponenteGeneradorUnitario, ArrayList<String> objDefinicionesModelos, ArrayList<String> objFuncionesModelos){                 
        if(objComponenteGeneradorUnitario.getObjModeloAsociado() != null){
            ObjetoTipoDatoReflexion objTipoDato = objComponenteGeneradorUnitario.getObjTipoDato();
            ModeloAsociado objModeloAsociado = objComponenteGeneradorUnitario.getObjModeloAsociado();
            if(objModeloAsociado.geteTipoColeccion() == TipoColeccionModeloAsociado.eAbstractList){                    
                String strClassPath = objTipoDato.getStrClassPath();
                ComponenteGeneradoInterno objComponenteGeneradoInterno = objComponenteGeneradorUnitario.getObjComponenteGenerador();
                if(objTipoDato.contieneRepresentacionesGenericas()){
                    strClassPath += objTipoDato.getClassTypesGeneric(false);
                }
                else{                                
                    strClassPath += "<" + objComponenteGeneradoInterno.getObjPropiedadBeans().getStrClassPathParametroDefaul() + ">";
                }
                String strDefModel = "private " + strClassPath + " objColeccion" + objComponenteGeneradoInterno.getName() +" = new " + strClassPath + "();\n";                    
                String strFuncModel = "public " + strClassPath + " devolverColeccion" + objComponenteGeneradoInterno.getName() + "(){\n" + 
                        "return objColeccion" + objComponenteGeneradoInterno.getName() + ";\n}\n";
                objDefinicionesModelos.add(strDefModel);
                objFuncionesModelos.add(strFuncModel);
            }
        }
    }
    
    private static void loadConfigComponenteBeans(VelocityContext context, ComponenteBeans objComponenteBeans){

        List objDefiniciones = new ArrayList<String>();
        List objMetodosSetGet = new ArrayList<HashMap<String, String>>();
        
        //Propiedad Simple: primitivos, jdk
        for(PropiedadBeans objPropiedad : objComponenteBeans.getObjPropiedadesStaticSimpleBeans()){
            String strDefinicion = "private " + objPropiedad.getStrClassPathParametroDefaul() +
                    " " + objPropiedad.getObjComponente().getName() + ";";
            HashMap<String, String> objMap = new HashMap<String, String>();
            objMap.put("classpath", objPropiedad.getStrClassPathParametroDefaul());
            objMap.put("propiedad", objPropiedad.getObjComponente().getName());
            objDefiniciones.add(strDefinicion);
            objMetodosSetGet.add(objMap);
        }
        
        for(ComponenteBeans objComponenteBeansInterno : objComponenteBeans.getObjPropiedadesStaticObjectBeans()){
            String strDefinicion = "private " + objComponenteBeansInterno.getObjComponenteDistribuidor().getName() +
                    " " + objComponenteBeansInterno.getName() + ";";
            HashMap<String, String> objMap = new HashMap<String, String>();
            objMap.put("classpath", objComponenteBeansInterno.getObjComponenteDistribuidor().getName());
            objMap.put("propiedad", objComponenteBeansInterno.getName());
            objDefiniciones.add(strDefinicion);
            objMetodosSetGet.add(objMap);
        }        
        
        context.put("definiciones", objDefiniciones);
        context.put("metodosGetSet", objMetodosSetGet);
    }
    
    private static void loadConfigComponenteDistribuidor(VelocityContext context, ComponenteDistribuidor objComponenteDistribuidor){
        List objImportaciones = generarImport(objComponenteDistribuidor.getStrPaquete(), objComponenteDistribuidor);
        context.put("importaciones", objImportaciones);

        List objDefiniciones = generarDefinicion(objComponenteDistribuidor);
        context.put("definiciones", objDefiniciones);

        List objInicializaciones = generarInicializacion(objComponenteDistribuidor);
        context.put("inicializaciones", objInicializaciones);            

        List objPropiedades = generarPropiedad(objComponenteDistribuidor);
        context.put("propiedades", objPropiedades);    
        
        List objOyentes = generarOyentes(objComponenteDistribuidor);
        context.put("oyentes", objOyentes);    
        
        if(objComponenteDistribuidor instanceof ComponenteDistribuidorExtra){
            ComponenteDistribuidorExtra objComponenteExtra = (ComponenteDistribuidorExtra) objComponenteDistribuidor;
            if(objComponenteExtra.getObjModeloAsociado() != null){
                ModeloAsociado objModeloAsociado = objComponenteExtra.getObjModeloAsociado();
                if(objModeloAsociado.geteTipoColeccion() == TipoColeccionModeloAsociado.eAbstractList){
                }
            }
        }
        else if(objComponenteDistribuidor instanceof ComponenteDistribuidorGeneradorUnitario){
            ArrayList<Map<String, Object>> objMapEventos = new ArrayList<Map<String, Object>>();
            ComponenteDistribuidorGeneradorUnitario objComponenteGeneradorUnitario = (ComponenteDistribuidorGeneradorUnitario) objComponenteDistribuidor;
            ComponenteGeneradoInterno objComponenteGeneradoInterno = objComponenteGeneradorUnitario.getObjComponenteGenerador();
            if(objComponenteGeneradorUnitario.getObjModeloAsociado() != null){
                ModeloAsociado objModeloAsociado = objComponenteGeneradorUnitario.getObjModeloAsociado();                
                if(objModeloAsociado.geteTipoColeccion() == TipoColeccionModeloAsociado.eAbstractList){
                    ComponenteGeneradoSimple objComponenteGeneradoSimple = objComponenteGeneradorUnitario.getObjComponentesGenerados().get(1);
                    if(objComponenteGeneradorUnitario.existeComponenteEnDistribucionActual(objComponenteGeneradoSimple)){
                        Map<String, Object> objMapButtonAgregar = new HashMap<String, Object>();
                        objMapButtonAgregar.put("name", objComponenteGeneradoSimple.getName());
                        objMapButtonAgregar.put("interfaz", "ActionListener");
                        objMapButtonAgregar.put("paquete", "java.awt.event");
                        objMapButtonAgregar.put("evento_metodo", "ActionPerformed");
                        objMapButtonAgregar.put("evento", "actionPerformed");
                        objMapButtonAgregar.put("accion", "ActionEvent");
                        objMapButtonAgregar.put("evt", "evt");
                        ArrayList<String> objLineas = new ArrayList<String>();
                        String strLinea = objModeloAsociado.getObjComponenteDistribuidorModeloAsociado().getName() + " objDialog = new " + objModeloAsociado.getObjComponenteDistribuidorModeloAsociado().getName() + "();";
                        objLineas.add(strLinea);
                        strLinea = "objDialog.setModal(true);\n";
                        objLineas.add(strLinea);
                        strLinea = "objDialog.setVisible(true);\n";
                        objLineas.add(strLinea);
                        strLinea = "Object obj = objDialog.getObj();\n";
                        objLineas.add(strLinea);
                        strLinea = "if(obj != null){\n";
                        objLineas.add(strLinea);
                        if(objComponenteGeneradorUnitario.getObjTipoDato().contieneRepresentacionesGenericas()){
                            String strGeneric = objComponenteGeneradorUnitario.getObjTipoDato().getObjTiposGenericos().get(0).getStrClassPath();
                            strLinea = "objColeccion.add((" + strGeneric + ")obj);\n";
                        }
                        else{
                            strLinea = "objColeccion.add(obj);\n";
                        }                        
                        objLineas.add(strLinea);                        
                        strLinea = "javax.swing.JList objList = new javax.swing.JList(objColeccion.toArray());\n";
                        objLineas.add(strLinea);                        
                        strLinea = objComponenteGeneradoInterno.getName() + ".setModel(objList.getModel());\n";
                        objLineas.add(strLinea);
                        strLinea = "}\n";
                        objLineas.add(strLinea);                        
                        objMapButtonAgregar.put("lineas", objLineas);                                                
                        objMapEventos.add(objMapButtonAgregar);                                               
                    }                    
                    objComponenteGeneradoSimple = objComponenteGeneradorUnitario.getObjComponentesGenerados().get(2);
                    if(objComponenteGeneradorUnitario.existeComponenteEnDistribucionActual(objComponenteGeneradoSimple)){
                        Map<String, Object> objMapButtonEliminar = new HashMap<String, Object>();
                        objMapButtonEliminar.put("name", objComponenteGeneradoSimple.getName());
                        objMapButtonEliminar.put("interfaz", "ActionListener");
                        objMapButtonEliminar.put("paquete", "java.awt.event");
                        objMapButtonEliminar.put("evento_metodo", "ActionPerformed");
                        objMapButtonEliminar.put("evento", "actionPerformed");
                        objMapButtonEliminar.put("accion", "ActionEvent");
                        objMapButtonEliminar.put("evt", "evt");
                        ArrayList<String> objLineas = new ArrayList<String>();
                        String strLinea = "if(" + objComponenteGeneradorUnitario.getObjComponenteGenerador().getName() + ".isSelectionEmpty())return;\n";
                        objLineas.add(strLinea);
                        strLinea = 
                        "if(JOptionPane.showConfirmDialog(this,\"¿Desea Eliminar el Elemento de la Lista?\", \"Eliminar Elemento\", JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE) == JOptionPane.NO_OPTION)return;\n";     
                        objLineas.add(strLinea);
                        strLinea = "objColeccion.remove(" + objComponenteGeneradoInterno.getName() + ".getSelectedIndex());\n";
                        objLineas.add(strLinea);
                        strLinea = "javax.swing.JList objList = new javax.swing.JList(objColeccion.toArray());\n";
                        objLineas.add(strLinea);                        
                        strLinea = objComponenteGeneradoInterno.getName() + ".setModel(objList.getModel());\n";                        
                        objLineas.add(strLinea);                        
                        objMapButtonEliminar.put("lineas", objLineas);                                                
                        objMapEventos.add(objMapButtonEliminar);                        
                    }
                }
            }
            List objModelo = objMapEventos;
            context.put("modelo", objModelo);                            
        }  

        List objDistribuciones = generarDistribucion(objComponenteDistribuidor);
        context.put("distribuciones", objDistribuciones);              
        
        List objMetodosSetGet = generarMetodosGetSetComponenteDistribuidor(objComponenteDistribuidor);
        context.put("metodosGetSet", objMetodosSetGet); 
    }
    
    private static void loadConfigComponenteDistribuidorContenedorPlantillaMosaico(VelocityContext context, ComponenteDistribuidorContenedor objComponenteDistribuidorContenedor){
        List objImportaciones = generarImport(objComponenteDistribuidorContenedor.getStrPaquete(), objComponenteDistribuidorContenedor);
        context.put("importaciones", objImportaciones);

        List objDefiniciones = generarDefinicion(objComponenteDistribuidorContenedor);
        context.put("definiciones", objDefiniciones);

        List objInicializaciones = generarInicializacion(objComponenteDistribuidorContenedor);
        context.put("inicializaciones", objInicializaciones);                         

        List objDistribuciones = generarDistribucion(objComponenteDistribuidorContenedor);
        context.put("distribuciones", objDistribuciones);              
        
        List objMetodosSetGet = generarMetodosGetSetComponenteDistribuidor(objComponenteDistribuidorContenedor);
        context.put("metodosGetSet", objMetodosSetGet); 
    }   
    
    private static void loadConfigComponenteDistribuidorContenedorPlantillaTab(VelocityContext context, ComponenteDistribuidorContenedor objComponenteDistribuidorContenedor){
        List objImportaciones = generarImport(objComponenteDistribuidorContenedor.getStrPaquete(), objComponenteDistribuidorContenedor);
        context.put("importaciones", objImportaciones);

        List objDefiniciones = generarDefinicion(objComponenteDistribuidorContenedor);
        context.put("definiciones", objDefiniciones);

        List objInicializaciones = generarInicializacion(objComponenteDistribuidorContenedor);
        context.put("inicializaciones", objInicializaciones);                         

        List objInclusiones = new ArrayList<String>();
        for(Componente objComponente : objComponenteDistribuidorContenedor.getComponentesDistribuidos()){
            if(objComponente instanceof ComponenteDistribuidorIntegrador){
                ComponenteDistribuidorIntegrador objComponenteDistribuidorIntegrador = (ComponenteDistribuidorIntegrador) objComponente;
                objInclusiones.add("jTabbedPaneComponentes.addTab(\"" + objComponenteDistribuidorIntegrador.getStrTitulo() + "\", obj" + objComponenteDistribuidorIntegrador.getName() + ");");
            }
        }
        context.put("inclusiones", objInclusiones);              
        
        List objMetodosSetGet = generarMetodosGetSetComponenteDistribuidor(objComponenteDistribuidorContenedor);
        context.put("metodosGetSet", objMetodosSetGet); 
    }
    
    private static void loadConfigDialogModeloAsociado(VelocityContext context, ComponenteDistribuidorModeloAsociado objComponenteDistribuidorModeloAsociado){
               
        String strObj = String.valueOf(context.get("obj"));        
        String strLineaOk;
        String strLineaCancel;
            
        if(objComponenteDistribuidorModeloAsociado.getObjComponenteDistribuidorObject() instanceof ComponenteDistribuidorGeneradorClaseCompleja){        
            strLineaOk = "obj" + strObj + " = jPanelModeloAsociado.encapsularObj();\n";
            strLineaCancel = "obj" + strObj + " = null;\n";
            
            context.put("linea_encapsular", strLineaOk);
            context.put("linea_cancelar", strLineaCancel);
            context.put("linea_cerrar_button_cancel", "dispose();\n");
            context.put("linea_cerrar_button_ok", "if(obj" + strObj + " != null)dispose();\n");
        }
        else if(objComponenteDistribuidorModeloAsociado.getObjComponenteDistribuidorObject() instanceof ComponenteDistribuidorGeneradorUnitario){        
            ComponenteDistribuidorGeneradorUnitario objComponenteDistribuidorGeneradorUnitario = (ComponenteDistribuidorGeneradorUnitario) objComponenteDistribuidorModeloAsociado.getObjComponenteDistribuidorObject();
            ObjetoTipoDatoReflexion objObjetoTipoReflexion = objComponenteDistribuidorGeneradorUnitario.getObjTipoDato();
            
            if(objObjetoTipoReflexion.getObjCaso().geteCaso() == TipoCaso.ePrimitivo){
//                strLineaOk = "obj" + strObj + " = jPanelModeloAsociado.encapsularObj();\n";
//                strLineaCancel = "obj" + strObj + " = null;\n";
//
//                context.put("linea_encapsular", strLineaOk);
//                context.put("linea_cancelar", strLineaCancel);
//                context.put("linea_cerrar_button_cancel", "dispose();\n");
//                context.put("linea_cerrar_button_ok", "if(obj" + strObj + " != null)dispose();\n");                
            }
            else if(objObjetoTipoReflexion.getObjCaso().geteCaso() == TipoCaso.eJDKRegistrado){
//                strLineaOk = "obj" + strObj + " = jPanelModeloAsociado.encapsularObj();\n";
//                strLineaCancel = "obj" + strObj + " = null;\n";
//
//                context.put("linea_encapsular", strLineaOk);
//                context.put("linea_cancelar", strLineaCancel);
//                context.put("linea_cerrar_button_cancel", "dispose();\n");
//                context.put("linea_cerrar_button_ok", "if(obj" + strObj + " != null)dispose();\n");
            }
        }
    }
    
    /**
     * Esta función se encarga de generar los metodos de acceso a los controles de la interfaz
     * gráfica generada.
     * @param objComponenteDistribuidor Componente que representa la interfaz gráfica a la
     * cuál se le generarán los métodos.
     * @return Colección con los Métodos Generados o null si ocurre un error.
     */
    public static List generarMetodosGetSetComponenteDistribuidor(ComponenteDistribuidor objComponenteDistribuidor){
       try{ 
        List objMetodosSetGet = new ArrayList<HashMap<String, String>>();
        
        //Propiedad Simple: primitivos, jdk
        for(Componente objComponente : objComponenteDistribuidor.getComponentesDistribuidos()){
            
            if(objComponente instanceof ComponenteDistribuidor){
                if(objComponente instanceof ComponenteDistribuidorIntegradorSimple){
                    ComponenteDistribuidorIntegradorSimple objComponenteDistribuidorIntegradorSimple = (ComponenteDistribuidorIntegradorSimple) objComponente;                    
                    HashMap<String, String> objMap = new HashMap<String, String>();
                    objMap.put("classpath", objComponenteDistribuidorIntegradorSimple.getName());
                    objMap.put("propiedad", "obj" + objComponenteDistribuidorIntegradorSimple.getName());
                    objMetodosSetGet.add(objMap);
                }
                else if(objComponente instanceof ComponenteDistribuidorIntegradorMetodo){
                    ComponenteDistribuidorIntegradorMetodo objComponenteDistribuidorIntegradorMetodo = (ComponenteDistribuidorIntegradorMetodo) objComponente;                    
                    HashMap<String, String> objMap = new HashMap<String, String>();
                    objMap.put("classpath", objComponenteDistribuidorIntegradorMetodo.getName());
                    objMap.put("propiedad", "obj" + objComponenteDistribuidorIntegradorMetodo.getName());
                    objMetodosSetGet.add(objMap);
                }
                else if(objComponente instanceof ComponenteDistribuidorGeneradorClaseCompleja){
                    ComponenteDistribuidorGeneradorClaseCompleja objComponenteDistribuidorGeneradorClase = (ComponenteDistribuidorGeneradorClaseCompleja) objComponente;
                    HashMap<String, String> objMap = new HashMap<String, String>();
                    objMap.put("classpath", objComponenteDistribuidorGeneradorClase.getName());
                    objMap.put("propiedad", "obj" + objComponenteDistribuidorGeneradorClase.getName());
                    objMetodosSetGet.add(objMap);
                }
                else{
                    generarMetodosGetSetComponente((ComponenteDistribuidor) objComponente, objMetodosSetGet);
                }
            }
            else if(objComponente instanceof ComponenteGeneradoInterno){
                ComponenteGeneradoInterno objComponenteGeneradoInterno = (ComponenteGeneradoInterno) objComponente;
                HashMap<String, String> objMap = new HashMap<String, String>();
                objMap.put("classpath", objComponenteGeneradoInterno.getStrClassPath());
                objMap.put("propiedad", objComponenteGeneradoInterno.getName());
                objMetodosSetGet.add(objMap);
            }
        }
        return objMetodosSetGet;
    }catch(java.lang.NullPointerException ex){}
       return null;
    }    
    
    private static List generarMetodosGetSetComponente(ComponenteDistribuidor objComponenteDistribuidor, List objMetodosSetGet){
        //Propiedad Simple: primitivos, jdk
        for(Componente objComponente : objComponenteDistribuidor.getComponentesDistribuidos()){            
            if(objComponente instanceof ComponenteDistribuidorGeneradorUnitario ||
                    objComponente instanceof ComponenteDistribuidorGeneradorEnum){
                generarMetodosGetSetComponente((ComponenteDistribuidor) objComponente, objMetodosSetGet);
            }
            else if(objComponente instanceof ComponenteGeneradoInterno){
                ComponenteGeneradoInterno objComponenteGeneradoInterno = (ComponenteGeneradoInterno) objComponente;
                HashMap<String, String> objMap = new HashMap<String, String>();
                objMap.put("classpath", objComponenteGeneradoInterno.getStrClassPath());
                objMap.put("propiedad", objComponenteGeneradoInterno.getName());
                objMetodosSetGet.add(objMap);
            }
        }       
        return objMetodosSetGet;
    } 
    
    /**
     * Asigna las Opciones generales de Generación del Proyecto.
     * @param objComponenteDistribuidor Componente que Generará el Código Fuente.
     * @param objCodeContextClass Contexto de Generación de Código Fuente.
     */
    public static void generatorSourceCodeGlobalDefinitions(ComponenteDistribuidor objComponenteDistribuidor, CodeContextClass objCodeContextClass, ConfiguracionGeneradorCodigo objCFG){
        objCodeContextClass.add("user", objCFG.strUsuario);
        objCodeContextClass.add("date", new Date().toString());
        objCodeContextClass.add("title", objComponenteDistribuidor.getStrTitulo());
    }
    
    private static void generatorSourceCodeGlobalDefinitionsAsociateModel(CodeContextClass objCodeContextClass, ComponenteDistribuidorModeloAsociado objComponenteDistribuidorModeloAsociado, ComponenteDistribuidorGenerador objComponenteDistribuidorGeneradorObject) {
        objCodeContextClass.add("title", objComponenteDistribuidorModeloAsociado.getStrTitulo());            
        objCodeContextClass.add("classpathpanel", objComponenteDistribuidorGeneradorObject.getName());
        objCodeContextClass.add("classpathobj", objComponenteDistribuidorGeneradorObject.getObjTipoDato().getStrClassPath());
        objCodeContextClass.add("obj", objComponenteDistribuidorGeneradorObject.getObjTipoDato().getStrNombre());
    }
    
    /**
     * Asigna Opciones especificas a la generación actual. Las Opciones especificas
     * son aquellas que aplican a un determinado tipo de componente.
     * @param objComponenteDistribuidor Componente que genera el Código Fuente.
     * @param objCodeContextClass Contexto de Generación de Código Fuente.
     */
    public static void generatorSourceCodeOption(ComponenteDistribuidor objComponenteDistribuidor, CodeContextClass objCodeContextClass){
        //Evaluar si contiene un Modelo Asociado
        if(objComponenteDistribuidor instanceof ComponenteDistribuidorGeneradorUnitario){
            ComponenteDistribuidorGeneradorUnitario objComponenteDistribuidorGeneradorUnitario = (ComponenteDistribuidorGeneradorUnitario) objComponenteDistribuidor;
            if(objComponenteDistribuidorGeneradorUnitario.getObjModeloAsociado() != null){
                objCodeContextClass.add("isEncapsule", true);
                objCodeContextClass.add("classpathobj", objComponenteDistribuidorGeneradorUnitario.getObjTipoDato().getStrClassPath());
            }
        }
    }
    
    /**
     * Genera las el Código Fuente para las Funciones de encapsulación de propiedades.
     * @param objComponenteDistribuidor Componente que genera el Código Fuente.
     * @param objCodeContextClass Contexto de generación de Código Fuente.
     */
    public static void generatorSourceCodeFunctionEncapsulationGeneric(ComponenteDistribuidor objComponenteDistribuidor, CodeContextClass objCodeContextClass){
        if(objComponenteDistribuidor instanceof ComponenteDistribuidorGenerador){
            ComponenteDistribuidorGenerador objComponenteDistribuidorGenerador = (ComponenteDistribuidorGenerador) objComponenteDistribuidor;
            objCodeContextClass.addFunctions(objComponenteDistribuidorGenerador.generateSourceCodeSyntaxEncapsulatedFunction());            
        }
    }
    
    /**
     * Genera el Código Fuente para los Componentes con Distribuciones.
     * @param objContext 
     * @param objComponenteDistribuidor
     * @param objCodeContextClass
     */
    public static void generatorSourceCodeComponenteDistribuidor(VelocityContext objContext, ComponenteDistribuidor objComponenteDistribuidor, CodeContextClass objCodeContextClass){
        if(objComponenteDistribuidor instanceof ComponenteDistribuidorGenerador){            
            generatorSourceCodeComponenteDistribuidorGenerador(objContext, objComponenteDistribuidor, objCodeContextClass);
        }
    }
    
    /**
     *
     * @param objContext
     * @param objComponenteDistribuidor
     * @param objCodeContextClass
     */
    public static void generatorSourceCodeComponenteDistribuidorGenerador(VelocityContext objContext, ComponenteDistribuidor objComponenteDistribuidor, CodeContextClass objCodeContextClass){
        if(objComponenteDistribuidor instanceof ComponenteDistribuidorGeneradorUnitario){            
            ComponenteDistribuidorGeneradorUnitario objComponenteDistribuidorGeneradorUnitario = (ComponenteDistribuidorGeneradorUnitario) objComponenteDistribuidor;
            if(objComponenteDistribuidorGeneradorUnitario.getObjModeloAsociado() != null){
                objContext.put("FieldsDefinitionEventsButtonsAbstractListModel", EnumTypeCodeSyntax.eFieldsDefinitionEventsAsociateModelAbstractListCanonical.toString());
                objContext.put("FieldsDefinitionFunctionEventsButtonsAbstractListModel", EnumTypeCodeSyntax.eFieldsDefinitionEventsFunctionsAsociateModelAbstractListCanonical.toString());
            }
        }
    }
    
    /**
     *
     * @param objComponenteDistribuidor
     * @param objCFG
     */
    public static void generatorSourceCode(ComponenteDistribuidor objComponenteDistribuidor, ConfiguracionGeneradorCodigo objCFG) {
        try {                        
            //------------------------------------------------------------------/
            //Inicialización del Motor de Plantilla
            //------------------------------------------------------------------/
            VelocityEngine objVelocityEngine = GeneradorCodigoFuente.startVelocityEngine();            
            //------------------------------------------------------------------/
            //Inicialización del Contexto
            //------------------------------------------------------------------/
            VelocityContext objContext = new VelocityContext(); 
            //------------------------------------------------------------------/
            //Inicialización de la Definición de Sintaxis
            //------------------------------------------------------------------/
            GeneradorSintaxisDefinicion objGeneradorSintaxisDefinicion = new GeneradorSintaxisDefinicion(objComponenteDistribuidor);
            //------------------------------------------------------------------/
            //Inicialización del Generador Código
            //------------------------------------------------------------------/
            CodeContextClass objCodeContextClass = (CodeContextClass) objGeneradorSintaxisDefinicion.getCodeContext();
            
            //------------------------------------------------------------------/
            //Inicialización del Generador Código
            //------------------------------------------------------------------/
            generatorSourceCodeGlobalDefinitions(objComponenteDistribuidor, objCodeContextClass, objCFG);
            //generatorSourceCodeOption(objComponenteDistribuidor, objCodeContextClass);
            //generatorSourceCodeFunctionEncapsulationGeneric(objComponenteDistribuidor, objCodeContextClass);
            
            objContext.put("objClass", objCodeContextClass);                 
            
            //------------------------------------------------------------------/
            //Fase de Importación de Definiciones de Clases
            //------------------------------------------------------------------/
            objContext.put("FaseImport",                                EnumTypeCodeSyntax.eFaseImport.toString());
            
            //------------------------------------------------------------------/
            //Fase de Atributos
            //------------------------------------------------------------------/
            objContext.put("FaseFieldDefinitionInstance",               EnumTypeCodeSyntax.eFaseFieldDefinitionInstance.toString());
            objContext.put("FaseFieldDefinitionClass",                  EnumTypeCodeSyntax.eFaseFieldDefinitionClass.toString());
            objContext.put("FaseFieldDefinitionConstant",               EnumTypeCodeSyntax.eFaseFieldDefinitionConstant.toString());
            objContext.put("FaseFieldInitializationInstance",           EnumTypeCodeSyntax.eFaseFieldInitializationInstance.toString());
            objContext.put("FaseFieldInitializationClass",              EnumTypeCodeSyntax.eFaseFieldInitializationClass.toString());
            objContext.put("FaseFieldInitializationProperties",         EnumTypeCodeSyntax.eFaseFieldInitializationProperties.toString());
            objContext.put("FaseFieldInitializationGridBagConstraints", EnumTypeCodeSyntax.eFaseFieldInitializationGridBagConstraints.toString());
            
            //------------------------------------------------------------------/
            //Fase de Métodos
            //------------------------------------------------------------------/
            objContext.put("FaseMethodDefinitionEvent",                 EnumTypeCodeSyntax.eFaseMethodDefinitionEvent.toString());
            objContext.put("FaseMethodImplementEvent",                  EnumTypeCodeSyntax.eFaseMethodImplementEvent.toString());
            objContext.put("FaseMethodImplementFunctionEvent",          EnumTypeCodeSyntax.eFaseMethodImplementFunctionEvent.toString());            
            
            if(UtilOpciones.objPreferences.getBoolean(MyPreferences.BOOLEAN_CODIGO_GET)){
                objContext.put("FaseMethodImplementGetFunction",        EnumTypeCodeSyntax.eFaseMethodImplementGetFunction.toString());
            }
            if(UtilOpciones.objPreferences.getBoolean(MyPreferences.BOOLEAN_CODIGO_SET)){
                objContext.put("FaseMethodImplementSetFunction",        EnumTypeCodeSyntax.eFaseMethodImplementSetFunction.toString());
            }
            
            //------------------------------------------------------------------/
            //Fase de Menu
            //------------------------------------------------------------------/
            if(objComponenteDistribuidor instanceof ComponenteDistribuidorContenedorEspejo){
                ComponenteDistribuidorContenedorEspejo objComponenteDistribuidorContenedorEspejo = (ComponenteDistribuidorContenedorEspejo) objComponenteDistribuidor;
                if(objComponenteDistribuidorContenedorEspejo.hasMenuAvailable()){
                    objContext.put("FaseMethodDefinitionMenuEvent",             EnumTypeCodeSyntax.eFaseMethodDefinitionMenuEvent.toString());
                    objContext.put("FaseMethodImplementMenuEvent",              EnumTypeCodeSyntax.eFaseMethodImplementMenuEvent.toString());
                    objContext.put("FaseMethodImplementFunctionMenuEvent",      EnumTypeCodeSyntax.eFaseMethodImplementFunctionMenuEvent.toString());            
                }
            }
            
            //------------------------------------------------------------------/
            //Configuraciones de Generacion de Plantilla especificas para el Tipo de Componente
            //por ejemplo los modelos asociados para el Componente Generador Unitario
            //------------------------------------------------------------------/
            generatorSourceCodeComponenteDistribuidor(objContext, objComponenteDistribuidor, objCodeContextClass);            
            Template objTemplate = objVelocityEngine.getTemplate(getNameTemplate(objComponenteDistribuidor), ENCODING_SOURCE);
            
            File objArchivoSalida = File.createTempFile(objComponenteDistribuidor.getName(), ".java");
            objArchivoSalida.deleteOnExit();
            PrintStream flujoSalida = new PrintStream(objArchivoSalida);            
            
            BufferedWriter objBufferedWriter = new BufferedWriter(new OutputStreamWriter(flujoSalida));
            if (objTemplate != null){
                objTemplate.merge(objContext, objBufferedWriter);
            }
            
            /*
             * flush and cleanup
             */
            objBufferedWriter.flush();
            objBufferedWriter.close();
            
            if(UtilRepresentacion.tieneModeloAsociadoAsignado(objComponenteDistribuidor)){
                GeneradorCodigoFuente.crearModeloAsociado(objComponenteDistribuidor, objCFG);
            }            
            objComponenteDistribuidor.setObjFileOutput(objArchivoSalida); 
        } catch (ResourceNotFoundException ex) {
            Logger.getLogger(GeneradorCodigoFuente.class.getName()).log(Level.SEVERE, null, ex);
        } catch (ParseErrorException ex) {
            Logger.getLogger(GeneradorCodigoFuente.class.getName()).log(Level.SEVERE, null, ex);
        } catch (Exception ex) {
            Logger.getLogger(GeneradorCodigoFuente.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
    
    /**
     *
     * @param objComponenteDistribuidor
     * @return
     */
    public static String getNameTemplate(ComponenteDistribuidor objComponenteDistribuidor){
        String strTemplate = null;
        if(objComponenteDistribuidor instanceof ComponenteDistribuidorContenedor){
            ComponenteDistribuidorContenedor objComponenteDistribuidorContenedor = (ComponenteDistribuidorContenedor) objComponenteDistribuidor;        
            if(objComponenteDistribuidorContenedor.plantilla_generacion_codigo_fuente ==
                    ComponenteDistribuidorContenedor.PLANTILLA_MOSAICO){                
                strTemplate = "/com/ufps/cuatro/util/plantillas/vtlCodeGeneratorTemplateFrame.vsl";
            }            
            else if(objComponenteDistribuidorContenedor.plantilla_generacion_codigo_fuente ==
                    ComponenteDistribuidorContenedor.PLANTILLA_TAB){                
                strTemplate = "/com/ufps/cuatro/util/plantillas/vtlCodeGeneratorTemplateFrameWithTab.vsl";
            }
            else {                
                strTemplate = "/com/ufps/cuatro/util/plantillas/vtlCodeGeneratorTemplateFrame.vsl";
            }
        }
        else if(objComponenteDistribuidor instanceof ComponenteDistribuidorIntegrador){
            strTemplate = "/com/ufps/cuatro/util/plantillas/vtlCodeGeneratorTemplatePanel.vsl";
        }
        else if(objComponenteDistribuidor instanceof ComponenteDistribuidorGenerador){
            strTemplate = "/com/ufps/cuatro/util/plantillas/vtlCodeGeneratorTemplatePanel.vsl";
            
        }
        else if(objComponenteDistribuidor instanceof ComponenteDistribuidorModeloAsociado){
            strTemplate = "/com/ufps/cuatro/util/plantillas/vtlCodeGeneratorTemplateDialog.vsl";
        }        
        return strTemplate == null ? "/com/ufps/cuatro/util/plantillas/vtlJFrame.vsl" : strTemplate;
    }
    
    /**
     *
     * @param objComponenteDistribuidor
     * @param objCFG
     */
    public static void generatorSourceCode(ComponenteDistribuidorContenedor objComponenteDistribuidor, ConfiguracionGeneradorCodigo objCFG) {
        try {              
            //------------------------------------------------------------------/
            //Inicialización del Motor de Plantilla
            //------------------------------------------------------------------/
            VelocityEngine objVelocityEngine = GeneradorCodigoFuente.startVelocityEngine();            
            //------------------------------------------------------------------/
            //Inicialización del Contexto
            //------------------------------------------------------------------/
            VelocityContext objContext = new VelocityContext(); 
            //------------------------------------------------------------------/
            //Inicialización de la Definición de Sintaxis
            //------------------------------------------------------------------/
            GeneradorSintaxisDefinicion objGeneradorSintaxisDefinicion = new GeneradorSintaxisDefinicion(objComponenteDistribuidor);
            //------------------------------------------------------------------/
            //Inicialización del Generador Código
            //------------------------------------------------------------------/
            CodeContextClass objCodeContextClass = (CodeContextClass) objGeneradorSintaxisDefinicion.getCodeContext();
            
            //------------------------------------------------------------------/
            //Inicialización del Generador Código
            //------------------------------------------------------------------/
            generatorSourceCodeGlobalDefinitions(objComponenteDistribuidor, objCodeContextClass, objCFG);            
            
            objContext.put("objClass", objCodeContextClass);                 
            
            //------------------------------------------------------------------/
            //Fase de Importación de Definiciones de Clases
            //------------------------------------------------------------------/
            objContext.put("FaseImport",                                EnumTypeCodeSyntax.eFaseImport.toString());
            objCodeContextClass.getObjSentences().add(EnumTypeCodeSyntax.eFaseImport.toString());
            
            //------------------------------------------------------------------/
            //Fase de Atributos
            //------------------------------------------------------------------/
            objContext.put("FaseFieldDefinitionInstance",               EnumTypeCodeSyntax.eFaseFieldDefinitionInstance.toString());
            objCodeContextClass.getObjSentences().add(EnumTypeCodeSyntax.eFaseFieldDefinitionInstance.toString());
            objContext.put("FaseFieldDefinitionClass",                  EnumTypeCodeSyntax.eFaseFieldDefinitionClass.toString());
            objCodeContextClass.getObjSentences().add(EnumTypeCodeSyntax.eFaseFieldDefinitionClass.toString());
            objContext.put("FaseFieldDefinitionConstant",               EnumTypeCodeSyntax.eFaseFieldDefinitionConstant.toString());
            objCodeContextClass.getObjSentences().add(EnumTypeCodeSyntax.eFaseFieldDefinitionConstant.toString());
            objContext.put("FaseFieldInitializationInstance",           EnumTypeCodeSyntax.eFaseFieldInitializationInstance.toString());
            objCodeContextClass.getObjSentences().add(EnumTypeCodeSyntax.eFaseFieldInitializationInstance.toString());
            objContext.put("FaseFieldInitializationClass",              EnumTypeCodeSyntax.eFaseFieldInitializationClass.toString());
            objCodeContextClass.getObjSentences().add(EnumTypeCodeSyntax.eFaseFieldInitializationClass.toString());
            objContext.put("FaseFieldInitializationProperties",         EnumTypeCodeSyntax.eFaseFieldInitializationProperties.toString());
            objCodeContextClass.getObjSentences().add(EnumTypeCodeSyntax.eFaseFieldInitializationProperties.toString());
            objContext.put("FaseFieldInitializationGridBagConstraints", EnumTypeCodeSyntax.eFaseFieldInitializationGridBagConstraints.toString());
            objCodeContextClass.getObjSentences().add(EnumTypeCodeSyntax.eFaseFieldInitializationGridBagConstraints.toString());
            
            //------------------------------------------------------------------/
            //Fase de Métodos
            //------------------------------------------------------------------/
            objContext.put("FaseMethodDefinitionEvent",                 EnumTypeCodeSyntax.eFaseMethodDefinitionEvent.toString());
            objCodeContextClass.getObjSentences().add(EnumTypeCodeSyntax.eFaseMethodDefinitionEvent.toString());
            objContext.put("FaseMethodImplementEvent",                  EnumTypeCodeSyntax.eFaseMethodImplementEvent.toString());
            objCodeContextClass.getObjSentences().add(EnumTypeCodeSyntax.eFaseMethodImplementEvent.toString());
            objContext.put("FaseMethodImplementFunctionEvent",          EnumTypeCodeSyntax.eFaseMethodImplementFunctionEvent.toString());            
            objCodeContextClass.getObjSentences().add(EnumTypeCodeSyntax.eFaseMethodImplementFunctionEvent.toString());
            
             //------------------------------------------------------------------/
            //Fase de Menu
            //------------------------------------------------------------------/
            if(objComponenteDistribuidor instanceof ComponenteDistribuidorContenedorEspejo){
                ComponenteDistribuidorContenedorEspejo objComponenteDistribuidorContenedorEspejo = (ComponenteDistribuidorContenedorEspejo) objComponenteDistribuidor;
                if(objComponenteDistribuidorContenedorEspejo.hasMenuAvailable()){                    
                    objContext.put("FaseMethodDefinitionMenuParentEvent",             EnumTypeCodeSyntax.eFaseMethodDefinitionMenuParentEvent.toString());
                    objCodeContextClass.getObjSentences().add(EnumTypeCodeSyntax.eFaseMethodDefinitionMenuParentEvent.toString());        
                    objContext.put("FaseMethodDefinitionMenuEvent",             EnumTypeCodeSyntax.eFaseMethodDefinitionMenuEvent.toString());
                    objCodeContextClass.getObjSentences().add(EnumTypeCodeSyntax.eFaseMethodDefinitionMenuEvent.toString());
                    objContext.put("FaseMethodImplementMenuEvent",              EnumTypeCodeSyntax.eFaseMethodImplementMenuEvent.toString());
                    objCodeContextClass.getObjSentences().add(EnumTypeCodeSyntax.eFaseMethodImplementMenuEvent.toString());
                    objContext.put("FaseMethodImplementFunctionMenuEvent",      EnumTypeCodeSyntax.eFaseMethodImplementFunctionMenuEvent.toString());            
                    objCodeContextClass.getObjSentences().add(EnumTypeCodeSyntax.eFaseMethodImplementFunctionMenuEvent.toString());
                }
                else{
                    for(Componente objComponente : objComponenteDistribuidor.getComponentesDistribuidos()){
                        if(objComponente instanceof ComponenteDistribuidorGeneradorClaseCompleja ||
                                objComponente instanceof ComponenteDistribuidorIntegrador ||
                                objComponente instanceof ComponenteDistribuidorContenedor){
                            ComponenteDistribuidor objComponenteDistribuidorInterno = (ComponenteDistribuidor) objComponente;
                            if(objComponenteDistribuidorInterno.hasMenuAvailable()){
                                objContext.put("FaseMethodDefinitionMenuParentEvent",             EnumTypeCodeSyntax.eFaseMethodDefinitionMenuParentEvent.toString());
                                objCodeContextClass.getObjSentences().add(EnumTypeCodeSyntax.eFaseMethodDefinitionMenuParentEvent.toString());        
                                objContext.put("FaseMethodDefinitionMenuEvent",             EnumTypeCodeSyntax.eFaseMethodDefinitionMenuEvent.toString());
                                objCodeContextClass.getObjSentences().add(EnumTypeCodeSyntax.eFaseMethodDefinitionMenuEvent.toString());
                                objContext.put("FaseMethodImplementMenuEvent",              EnumTypeCodeSyntax.eFaseMethodImplementMenuEvent.toString());
                                objCodeContextClass.getObjSentences().add(EnumTypeCodeSyntax.eFaseMethodImplementMenuEvent.toString());
                                objContext.put("FaseMethodImplementFunctionMenuEvent",      EnumTypeCodeSyntax.eFaseMethodImplementFunctionMenuEvent.toString());            
                                objCodeContextClass.getObjSentences().add(EnumTypeCodeSyntax.eFaseMethodImplementFunctionMenuEvent.toString());
                                break;
                            }
                        }            
                    } 
                }
            }
            
            if(UtilOpciones.objPreferences.getBoolean(MyPreferences.BOOLEAN_CODIGO_GET)){
                objContext.put("FaseMethodImplementGetFunction",        EnumTypeCodeSyntax.eFaseMethodImplementGetFunction.toString());
                objCodeContextClass.getObjSentences().add(EnumTypeCodeSyntax.eFaseMethodImplementGetFunction.toString());
            }
            if(UtilOpciones.objPreferences.getBoolean(MyPreferences.BOOLEAN_CODIGO_SET)){
                objContext.put("FaseMethodImplementSetFunction",        EnumTypeCodeSyntax.eFaseMethodImplementSetFunction.toString());
                objCodeContextClass.getObjSentences().add(EnumTypeCodeSyntax.eFaseMethodImplementSetFunction.toString());
            }
            
            //------------------------------------------------------------------/
            //Configuraciones de Generacion de Plantilla especificas para el Tipo de Componente
            //por ejemplo los modelos asociados para el Componente Generador Unitario
            //------------------------------------------------------------------/
            generatorSourceCodeComponenteDistribuidor(objContext, objComponenteDistribuidor, objCodeContextClass);     
            
            if(objComponenteDistribuidor.plantilla_generacion_codigo_fuente ==
                    ComponenteDistribuidorContenedor.PLANTILLA_TAB){                            
                objContext.put("FaseInitializationTab",        EnumTypeCodeSyntax.eFaseInitializationTab.toString());
                objCodeContextClass.getObjSentences().add(EnumTypeCodeSyntax.eFaseInitializationTab.toString());
            }
            
            Template objTemplate = objVelocityEngine.getTemplate(getNameTemplate(objComponenteDistribuidor), ENCODING_SOURCE);
            
            File objArchivoSalida = File.createTempFile(objComponenteDistribuidor.getName(), ".java");
            objArchivoSalida.deleteOnExit();
            PrintStream flujoSalida = new PrintStream(objArchivoSalida);            
            
            BufferedWriter objBufferedWriter = new BufferedWriter(new OutputStreamWriter(flujoSalida));
            if (objTemplate != null){
                objTemplate.merge(objContext, objBufferedWriter);
            }
            
            /*
             * flush and cleanup
             */
            objBufferedWriter.flush();
            objBufferedWriter.close();           
                        
            objComponenteDistribuidor.setObjFileOutput(objArchivoSalida); 
        } catch (ResourceNotFoundException ex) {
            Logger.getLogger(GeneradorCodigoFuente.class.getName()).log(Level.SEVERE, null, ex);
        } catch (ParseErrorException ex) {
            Logger.getLogger(GeneradorCodigoFuente.class.getName()).log(Level.SEVERE, null, ex);
        } catch (Exception ex) {
            Logger.getLogger(GeneradorCodigoFuente.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
    
    /**
     *
     * @param objComponenteDistribuidor
     * @param objCFG
     */
    public static void generatorSourceCode(ComponenteDistribuidorModeloAsociado objComponenteDistribuidor, ConfiguracionGeneradorCodigo objCFG) {
        try {            
            //------------------------------------------------------------------/
            //Inicialización del Motor de Plantilla
            //------------------------------------------------------------------/
            VelocityEngine objVelocityEngine = GeneradorCodigoFuente.startVelocityEngine();            
            //------------------------------------------------------------------/
            //Inicialización del Contexto
            //------------------------------------------------------------------/
            VelocityContext objContext = new VelocityContext(); 
            //------------------------------------------------------------------/
            //Inicialización de la Definición de Sintaxis
            //------------------------------------------------------------------/
            GeneradorSintaxisDefinicion objGeneradorSintaxisDefinicion = new GeneradorSintaxisDefinicion(objComponenteDistribuidor);
            //------------------------------------------------------------------/
            //Inicialización del Generador Código
            //------------------------------------------------------------------/
            CodeContextClass objCodeContextClass = (CodeContextClass) objGeneradorSintaxisDefinicion.getCodeContext();            
            //------------------------------------------------------------------/
            //Inicialización del Generador Código
            //------------------------------------------------------------------/
            generatorSourceCodeGlobalDefinitions(objComponenteDistribuidor, objCodeContextClass, objCFG);                        
            objContext.put("objClass", objCodeContextClass);                             
            //------------------------------------------------------------------/
            //Fase de Importación de Definiciones de Clases
            //------------------------------------------------------------------/
            objContext.put("FaseImport",                                EnumTypeCodeSyntax.eFaseImport.toString());            
            //------------------------------------------------------------------/
            //Fase de Atributos
            //------------------------------------------------------------------/
            objContext.put("FaseFieldDefinitionInstance",               EnumTypeCodeSyntax.eFaseFieldDefinitionInstance.toString());
            objContext.put("FaseFieldDefinitionClass",                  EnumTypeCodeSyntax.eFaseFieldDefinitionClass.toString());
            objContext.put("FaseFieldDefinitionConstant",               EnumTypeCodeSyntax.eFaseFieldDefinitionConstant.toString());
            objContext.put("FaseFieldInitializationInstance",           EnumTypeCodeSyntax.eFaseFieldInitializationInstance.toString());
            objContext.put("FaseFieldInitializationClass",              EnumTypeCodeSyntax.eFaseFieldInitializationClass.toString());
            objContext.put("FaseFieldInitializationProperties",         EnumTypeCodeSyntax.eFaseFieldInitializationProperties.toString());
            objContext.put("FaseFieldInitializationGridBagConstraints", EnumTypeCodeSyntax.eFaseFieldInitializationGridBagConstraints.toString());            
            //------------------------------------------------------------------/
            //Fase de Métodos
            //------------------------------------------------------------------/
            objContext.put("FaseMethodDefinitionEvent",                 EnumTypeCodeSyntax.eFaseMethodDefinitionEvent.toString());
            objContext.put("FaseMethodImplementEvent",                  EnumTypeCodeSyntax.eFaseMethodImplementEvent.toString());
            objContext.put("FaseMethodImplementFunctionEvent",          EnumTypeCodeSyntax.eFaseMethodImplementFunctionEvent.toString());            
            
            if(UtilOpciones.objPreferences.getBoolean(MyPreferences.BOOLEAN_CODIGO_GET)){
                objContext.put("FaseMethodImplementGetFunction",        EnumTypeCodeSyntax.eFaseMethodImplementGetFunction.toString());
            }
            if(UtilOpciones.objPreferences.getBoolean(MyPreferences.BOOLEAN_CODIGO_SET)){
                objContext.put("FaseMethodImplementSetFunction",        EnumTypeCodeSyntax.eFaseMethodImplementSetFunction.toString());
            }
            
            objContext.put("FaseDialogModelAsociateButtonOK",           EnumTypeCodeSyntax.eFaseDialogModelAsociateButtonOK.toString());
            objContext.put("FaseDialogModelAsociateButtonCancel",       EnumTypeCodeSyntax.eFaseDialogModelAsociateButtonCancel.toString());
            
            //------------------------------------------------------------------/
            //Configuraciones de Generacion de Plantilla especificas para el Tipo de Componente
            //por ejemplo los modelos asociados para el Componente Generador Unitario
            //------------------------------------------------------------------/
            generatorSourceCodeComponenteDistribuidor(objContext, objComponenteDistribuidor, objCodeContextClass);     
            ComponenteDistribuidorGenerador objComponenteDistribuidorGeneradorObject = (ComponenteDistribuidorGenerador) objComponenteDistribuidor.getObjComponenteDistribuidorObject();
            generatorSourceCodeGlobalDefinitionsAsociateModel(objCodeContextClass, objComponenteDistribuidor, objComponenteDistribuidorGeneradorObject);
            
            Template objTemplate = objVelocityEngine.getTemplate(getNameTemplate(objComponenteDistribuidor), ENCODING_SOURCE);
            
            File objArchivoSalida = File.createTempFile(objComponenteDistribuidor.getName(), ".java");
            objArchivoSalida.deleteOnExit();
            PrintStream flujoSalida = new PrintStream(objArchivoSalida);            
            
            BufferedWriter objBufferedWriter = new BufferedWriter(new OutputStreamWriter(flujoSalida));
            if (objTemplate != null){
                objTemplate.merge(objContext, objBufferedWriter);
            }
            
            /*
             * flush and cleanup
             */
            objBufferedWriter.flush();
            objBufferedWriter.close();           
                        
            objComponenteDistribuidor.setObjFileOutput(objArchivoSalida); 
        } catch (ResourceNotFoundException ex) {
            Logger.getLogger(GeneradorCodigoFuente.class.getName()).log(Level.SEVERE, null, ex);
        } catch (ParseErrorException ex) {
            Logger.getLogger(GeneradorCodigoFuente.class.getName()).log(Level.SEVERE, null, ex);
        } catch (Exception ex) {
            Logger.getLogger(GeneradorCodigoFuente.class.getName()).log(Level.SEVERE, null, ex);
        }
    }   
    
    /**
     *
     * @param objComponenteDistribuidorModeloAsociado
     * @param objCFG
     */
    public static void generatorSourceCodeDialogAsociateModel(ComponenteDistribuidorModeloAsociado objComponenteDistribuidorModeloAsociado, ConfiguracionGeneradorCodigo objCFG) {
        try {
            if(objComponenteDistribuidorModeloAsociado.getObjComponenteDistribuidorObject() instanceof ComponenteDistribuidorGenerador){            
                ComponenteDistribuidorGenerador objComponenteDistribuidorGeneradorObject = (ComponenteDistribuidorGenerador) objComponenteDistribuidorModeloAsociado.getObjComponenteDistribuidorObject();
                VelocityEngine objVelocityEngine = GeneradorCodigoFuente.startVelocityEngine();            
                VelocityContext objContext = new VelocityContext(); 
                GeneradorSintaxisDefinicion objGeneradorSintaxisDefinicion = new GeneradorSintaxisDefinicion(objComponenteDistribuidorModeloAsociado);
                CodeContextClass objCodeContextClass = (CodeContextClass) objGeneradorSintaxisDefinicion.getCodeContext();            
                
                generatorSourceCodeGlobalDefinitions(objComponenteDistribuidorModeloAsociado, objCodeContextClass, objCFG);
                generatorSourceCodeGlobalDefinitionsAsociateModel(objCodeContextClass, objComponenteDistribuidorModeloAsociado, objComponenteDistribuidorGeneradorObject);

                objContext.put("objClass", objCodeContextClass);                                             

                Template objTemplate = objVelocityEngine.getTemplate("/com/ufps/cuatro/util/plantillas/vtlCodeDialog.vsl", ENCODING_SOURCE);

                File objArchivoSalida = File.createTempFile(objComponenteDistribuidorModeloAsociado.getName(), ".java");
                objArchivoSalida.deleteOnExit();
                PrintStream flujoSalida = new PrintStream(objArchivoSalida);            

                BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(flujoSalida));
                if (objTemplate != null){
                    objTemplate.merge(objContext, writer);
                }
                //flush and cleanup            
                writer.flush();
                writer.close();            

                objComponenteDistribuidorModeloAsociado.setObjFileOutput(objArchivoSalida);                 
                
                generatorSourceCode(objComponenteDistribuidorGeneradorObject, objCFG);
            }            
        }catch(java.lang.Exception ex){
            Logger.getLogger(GeneradorCodigoFuente.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
    
    /**
     * Es la encargada de generar el código individual de los contenedores.
     * @param objComponenteDistribuidorContenedor 
     * @param objCFG Objeto de Configuración para la Generación Actual.
     * @return boolean que determina el resultado del proceso.
     */
    public static File generarCodigoComponenteContenedor(ComponenteDistribuidorContenedor objComponenteDistribuidorContenedor, ConfiguracionGeneradorCodigo objCFG) {
        try {             
            VelocityEngine objVEngine = GeneradorCodigoFuente.startVelocityEngine();            
            VelocityContext context = new VelocityContext();                                    
            GeneradorCodigoFuente.loadConfigInitContextContenedorFrame(context, objComponenteDistribuidorContenedor, objCFG);
            
            String strPlantilla;
            if(objComponenteDistribuidorContenedor.plantilla_generacion_codigo_fuente ==
                    ComponenteDistribuidorContenedor.PLANTILLA_MOSAICO){
                GeneradorCodigoFuente.loadConfigComponenteDistribuidorContenedorPlantillaMosaico(context, objComponenteDistribuidorContenedor);
                strPlantilla = "/com/ufps/cuatro/util/plantillas/vtlJFrame.vsl";
            }            
            else if(objComponenteDistribuidorContenedor.plantilla_generacion_codigo_fuente ==
                    ComponenteDistribuidorContenedor.PLANTILLA_TAB){
                GeneradorCodigoFuente.loadConfigComponenteDistribuidorContenedorPlantillaTab(context, objComponenteDistribuidorContenedor);
                strPlantilla = "/com/ufps/cuatro/util/plantillas/vtlJFrameTab.vsl";
            }
            else {
                GeneradorCodigoFuente.loadConfigComponenteDistribuidorContenedorPlantillaMosaico(context, objComponenteDistribuidorContenedor);
                strPlantilla = "/com/ufps/cuatro/util/plantillas/vtlJFrame.vsl";
            }
            
            Template objTemplate = objVEngine.getTemplate(strPlantilla, ENCODING_SOURCE);
            
            File objArchivoSalida = File.createTempFile(objComponenteDistribuidorContenedor.getName(), ".java");
            objArchivoSalida.deleteOnExit();
            PrintStream flujoSalida = new PrintStream(objArchivoSalida);
            
            BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(flujoSalida));
            if (objTemplate != null){
                objTemplate.merge(context, writer);
            }
            /*
             * flush and cleanup
             */
            writer.flush();
            writer.close();            
            //objArchivoSalida = formatCodeFile(objArchivoSalida);            
            objComponenteDistribuidorContenedor.setObjFileOutput(objArchivoSalida);
            return objArchivoSalida;
        } catch (Exception ex) {
            Logger.getLogger(GeneradorCodigoFuente.class.getName()).log(Level.SEVERE, null, ex);
        }
        return null;
    }
    
    /**
     * Es la encargada de generar el código individual de los paneles contenidos.
     * @param objComponenteDistribuidor Componente por el cual se generará el panel.
     * @param objCFG Objeto de Configuración para la Generación Actual.
     * @return boolean que determina el resultado del proceso.
     */
    public static File generadorCodigoFuenteComponenteDistribuidor(ComponenteDistribuidor objComponenteDistribuidor, ConfiguracionGeneradorCodigo objCFG) {
        try {            
            VelocityEngine objVEngine = GeneradorCodigoFuente.startVelocityEngine();            
            VelocityContext context = new VelocityContext();                                    
            GeneradorCodigoFuente.loadConfigInitContextComponenteDistribuidor(context, objComponenteDistribuidor, objCFG);
            GeneradorCodigoFuente.loadConfigComponenteDistribuidor(context, objComponenteDistribuidor);            
            
            if(crearFuncionEncapsularComponente(context, objComponenteDistribuidor, objCFG)){
                context.put("funciones", objCFG.objFunciones);                
            }
            
            if(objComponenteDistribuidor instanceof ComponenteDistribuidorGeneradorClaseCompleja ||
                    objComponenteDistribuidor instanceof ComponenteDistribuidorIntegrador){
                crearFuncionesEncapsularReturnTipoDatoComponenteDistribuidor(objComponenteDistribuidor, objCFG);
                if(!objCFG.objMapaFunciones.isEmpty()){
                    context.put("mapafunciones", objCFG.objMapaFunciones);
                }
            }
            
            Template objTemplate = objVEngine.getTemplate("/com/ufps/cuatro/util/plantillas/vtlJPanel.vsl", ENCODING_SOURCE);
            
            File objArchivoSalida = File.createTempFile(objComponenteDistribuidor.getName(), ".java");
            objArchivoSalida.deleteOnExit();
            PrintStream flujoSalida = new PrintStream(objArchivoSalida);            
            
            BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(flujoSalida));
            if (objTemplate != null){
                objTemplate.merge(context, writer);
            }
            /*
             * flush and cleanup
             */
            writer.flush();
            writer.close();
            
//            if(objComponenteDistribuidor.getObjComponenteBeans() != null){
//                ComponenteBeans objComponenteBeans = objComponenteDistribuidor.getObjComponenteBeans();
//                File objArchivoSalidaBeans = GeneradorCodigoFuente.generarCodigoComponenteBeans(objComponenteBeans, objCFG);
//                objComponenteBeans.setObjFileOutput(objArchivoSalidaBeans);
//            }
            
            if(UtilRepresentacion.tieneModeloAsociadoAsignado(objComponenteDistribuidor)){
                GeneradorCodigoFuente.crearModeloAsociado(objComponenteDistribuidor, objCFG);
            }            
            //objArchivoSalida = formatCodeFile(objArchivoSalida);
            objComponenteDistribuidor.setObjFileOutput(objArchivoSalida); 
            return objArchivoSalida;
        } catch (Exception ex) {
            Logger.getLogger(GeneradorCodigoFuente.class.getName()).log(Level.SEVERE, null, ex);
        }
        return null;
    }
    
    /**
     * Es la encargada de generar el código individual de los dialogos.
     * @param objComponenteDistribuidorModeloAsociado 
     * @param objCFG Objeto de Configuración para la Generación Actual.
     * @return boolean que determina el resultado del proceso.
     */
    public static File generarCodigoDialogModeloAsociado(ComponenteDistribuidorModeloAsociado objComponenteDistribuidorModeloAsociado, ConfiguracionGeneradorCodigo objCFG) {
//      if( objComponenteDistribuidorModeloAsociado != null){
        try {            
            VelocityEngine objVEngine = GeneradorCodigoFuente.startVelocityEngine();            
            VelocityContext context = new VelocityContext();                                    
            GeneradorCodigoFuente.loadConfigInitContextDialogModeloAsociado(context, objComponenteDistribuidorModeloAsociado, objCFG);
            GeneradorCodigoFuente.loadConfigDialogModeloAsociado(context, objComponenteDistribuidorModeloAsociado);           
            
            Template objTemplate = objVEngine.getTemplate("/com/ufps/cuatro/util/plantillas/vtlJDialog.vsl", ENCODING_SOURCE);
            
            File objArchivoSalida = File.createTempFile(objComponenteDistribuidorModeloAsociado.getName(), ".java");
            objArchivoSalida.deleteOnExit();
            PrintStream flujoSalida = new PrintStream(objArchivoSalida);
            
            BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(flujoSalida));
            if (objTemplate != null){
                objTemplate.merge(context, writer);
            }
            /*
             * flush and cleanup
             */
            writer.flush();
            writer.close();            
            //objArchivoSalida = formatCodeFile(objArchivoSalida);            
            objComponenteDistribuidorModeloAsociado.setObjFileOutput(objArchivoSalida);
            return objArchivoSalida;
        } catch (Exception ex) {
            Logger.getLogger(GeneradorCodigoFuente.class.getName()).log(Level.SEVERE, null, ex);
        }
        return null;
//    }
//      return null;
    }
    
    /**
     * 
     * @param objComponenteBeans
     * @param objCFG
     * @return
     */
    public static File generarCodigoComponenteBeans(ComponenteBeans objComponenteBeans, ConfiguracionGeneradorCodigo objCFG) {
//      if(objComponenteBeans != null){
        try {            
            VelocityEngine objVEngine = GeneradorCodigoFuente.startVelocityEngine();            
            VelocityContext context = new VelocityContext();                                    
            GeneradorCodigoFuente.loadConfigInitContextComponenteBeans(context, objComponenteBeans, objCFG);
            GeneradorCodigoFuente.loadConfigComponenteBeans(context, objComponenteBeans);            
            
            Template objTemplate = objVEngine.getTemplate("/com/ufps/cuatro/util/plantillas/vtlJavaBeans.vsl", ENCODING_SOURCE);
            
            File objArchivoSalida = File.createTempFile(objComponenteBeans.getName(), ".java");
            PrintStream flujoSalida = new PrintStream(objArchivoSalida);
            
            BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(flujoSalida));
            if (objTemplate != null){
                objTemplate.merge(context, writer);
            }
            /*
             * flush and cleanup
             */
            writer.flush();
            writer.close();            
            objComponenteBeans.setObjFileOutput(objArchivoSalida);
            return objArchivoSalida;
        } catch (Exception ex) {
            Logger.getLogger(GeneradorCodigoFuente.class.getName()).log(Level.SEVERE, null, ex);
        }
        return null;
//    }
//              return null;
    }
    
    /**
     * 
     * @param objModeloAsociado
     * @param objCFG
     * @return
     */
    public static ArrayList<File> generarCodigoModeloAsociado(ModeloAsociado objModeloAsociado, ConfiguracionGeneradorCodigo objCFG) {
//      if(objCFG != null){
        try {            
            ArrayList<File> objFiles = new ArrayList<File>();
            
            File objFileDialog = GeneradorCodigoFuente.generarCodigoDialogModeloAsociado(objModeloAsociado.getObjComponenteDistribuidorModeloAsociado(), objCFG);            
            File objFilePanelDialog = GeneradorCodigoFuente.generadorCodigoFuenteComponenteDistribuidor(objModeloAsociado.getObjComponenteDistribuidorModeloAsociado().getObjComponenteDistribuidorObject(), objCFG);                                    
            
            objFiles.add(objFileDialog);
            objFiles.add(objFilePanelDialog);
            
            return objFiles;
        } catch (Exception ex) {
            Logger.getLogger(GeneradorCodigoFuente.class.getName()).log(Level.SEVERE, null, ex);
        }
        return null;
//    }
//      return null;
    }
    
    private static ArrayList<String> generarImport(String strPaquete, ComponenteDistribuidor objComponenteDistribuidor){
        ArrayList<String> objImports = new ArrayList<String>();        
        generarImport(strPaquete, objImports, objComponenteDistribuidor);
        return objImports;
    }    
    
    private static void generarImport(String strPaquete, ArrayList<String> objImports, ComponenteDistribuidor objComponenteDistribuidor){                
        if(objComponenteDistribuidor instanceof ComponenteDistribuidorContenedor){
            ComponenteDistribuidorContenedor objComponenteDistribuidorContenedor = (ComponenteDistribuidorContenedor) objComponenteDistribuidor;
            for(Componente objComponenteIncluido : objComponenteDistribuidorContenedor.getComponentesDistribuidos()){
                if(objComponenteIncluido instanceof ComponenteDistribuidorIntegrador){
                    ComponenteDistribuidorIntegrador objComponenteDistribuidorIntegrador = (ComponenteDistribuidorIntegrador) objComponenteIncluido;            
                    if(!objComponenteDistribuidorIntegrador.getStrPaquete().endsWith(objComponenteDistribuidor.getStrPaquete())){                        
                        //Se requiere  definicion canonica porque no son del mismo paquete
                        String strImport = crearImport(objComponenteDistribuidorIntegrador.getStrPaquete() + GeneradorCodigoFuente.TOKEN_PUNTO + objComponenteDistribuidorIntegrador.getName());
                        if(!objImports.contains(strImport)){
                            objImports.add(strImport);
                        }
                    }
                }
                else if(objComponenteIncluido instanceof ComponenteDistribuidorGeneradorClaseCompleja){
                    ComponenteDistribuidorGeneradorClaseCompleja objComponenteDistribuidorGeneradorClase = (ComponenteDistribuidorGeneradorClaseCompleja) objComponenteIncluido;            
                    if(!objComponenteDistribuidorGeneradorClase.getStrPaquete().endsWith(objComponenteDistribuidor.getStrPaquete())){                        
                        //Se requiere  definicion canonica porque no son del mismo paquete
                        String strImport = crearImport(objComponenteDistribuidorGeneradorClase.getStrPaquete() + GeneradorCodigoFuente.TOKEN_PUNTO + objComponenteDistribuidorGeneradorClase.getName());
                        if(!objImports.contains(strImport)){
                            objImports.add(strImport);
                        }
                    }
                }
            }
        }
        else if(objComponenteDistribuidor instanceof ComponenteDistribuidorIntegrador){
            ComponenteDistribuidorIntegrador objComponenteDistribuidorIntegrador = (ComponenteDistribuidorIntegrador) objComponenteDistribuidor;
            for(ComponenteDistribuidor objComponenteDistribuidorIncluido : objComponenteDistribuidorIntegrador.getObjComponentesDistribuidores()){
                if(objComponenteDistribuidorIncluido instanceof ComponenteDistribuidorGeneradorClaseCompleja){
                    ComponenteDistribuidorGeneradorClaseCompleja objComponenteDistribuidorGeneradorClase = (ComponenteDistribuidorGeneradorClaseCompleja) objComponenteDistribuidorIncluido;            
                    if(!objComponenteDistribuidorGeneradorClase.getStrPaquete().endsWith(objComponenteDistribuidor.getStrPaquete())){                        
                        //Se requiere  definicion canonica porque no son del mismo paquete
                        String strImport = crearImport(objComponenteDistribuidorGeneradorClase.getStrPaquete() + GeneradorCodigoFuente.TOKEN_PUNTO + objComponenteDistribuidorGeneradorClase.getName());
                        if(!objImports.contains(strImport)){
                            objImports.add(strImport);
                        }
                    }
                }
            }
        }
        else if(objComponenteDistribuidor instanceof ComponenteDistribuidorGeneradorUnitario){
            ComponenteDistribuidorGeneradorUnitario objComponenteGeneradorUnitario = (ComponenteDistribuidorGeneradorUnitario) objComponenteDistribuidor;
            for(ComponenteDistribuidor objComponenteGenerador : objComponenteGeneradorUnitario.getObjComponentesDistribuidoresModeloAsociado()){
                if(!strPaquete.equals(objComponenteGenerador.getStrPaquete())){
                    String strImport = crearImport(objComponenteGenerador.getStrPaquete() + GeneradorCodigoFuente.TOKEN_PUNTO + objComponenteGenerador.getName());
                    if(!objImports.contains(strImport)){
                        objImports.add(strImport);
                    }                
                }
            }
            for(Componente objComponenteIncluido : objComponenteDistribuidor.getObjDistribuidorGrupalSeleccionado().getObjComponentesDistribuidos()){
                if(objComponenteIncluido instanceof ComponenteDistribuidor){                
                    generarImport(strPaquete, objImports, (ComponenteDistribuidor) objComponenteIncluido);
                }            
            } 
        }               
    }    
    
    private static ArrayList<Map<String, String>> generarOyentes(ComponenteDistribuidor objComponenteDistribuidor){
        ArrayList<Map<String, String>> objOyentes = new ArrayList<Map<String, String>>();        
        generarOyentes(objOyentes, objComponenteDistribuidor);
        return objOyentes;
    }
    
    private static void generarOyentes(ArrayList<Map<String, String>> objOyentes, ComponenteDistribuidor objComponenteDistribuidor){                
        for(Componente objComponenteIncluido : objComponenteDistribuidor.getObjDistribuidorGrupalSeleccionado().getObjComponentesDistribuidos()){            
            if(objComponenteIncluido instanceof ComponenteDistribuidor){                
                generarOyentes(objOyentes, (ComponenteDistribuidor) objComponenteIncluido);
            }
            else if(objComponenteIncluido instanceof ComponenteGeneradoInterno){
                if(!objComponenteIncluido.getObjOyentes().isEmpty()){
                    for(Oyente<Componente> objOyente : objComponenteIncluido.getObjOyentes()){
                        for(EventoOyente objEvento : objOyente.getObjEventos()){
                            if(objEvento.isIncluido()){
                                Map<String, String> objMapOyente = crearEventoOyente(objComponenteIncluido, objOyente, objEvento);                                
                                if(!objOyentes.contains(objMapOyente)){
                                    objOyentes.add(objMapOyente);
                                }
                            }
                        }
                    }
                }                
            }
            else if(objComponenteIncluido instanceof ComponenteGeneradoSimple){
                if(!objComponenteIncluido.getObjOyentes().isEmpty()){
                    for(Oyente<Componente> objOyente : objComponenteIncluido.getObjOyentes()){
                        for(EventoOyente objEvento : objOyente.getObjEventos()){
                            if(objEvento.isIncluido()){
                                Map<String, String> objMapOyente = crearEventoOyente(objComponenteIncluido, objOyente, objEvento);                                
                                if(!objOyentes.contains(objMapOyente)){
                                    objOyentes.add(objMapOyente);
                                }
                            }
                        }
                    }
                }                
            }
        }                
    }
    
    private static ArrayList<String> generarDefinicion(ComponenteDistribuidor objComponenteDistribuidor){
        ArrayList<String> objDefiniciones = new ArrayList<String>();        
        generarDefinicion(objDefiniciones, objComponenteDistribuidor);
        return objDefiniciones;
    }
    
    private static void generarDefinicion(ArrayList<String> objDefiniciones, ComponenteDistribuidor objComponenteDistribuidor){                
        for(Componente objComponenteIncluido : objComponenteDistribuidor.getObjDistribuidorGrupalSeleccionado().getObjComponentesDistribuidos()){
            String strDefinicion;
            if(objComponenteIncluido instanceof ComponenteDistribuidor){
                if(objComponenteIncluido instanceof ComponenteDistribuidorIntegradorSimple){
                    ComponenteDistribuidorIntegradorSimple objComponenteDistribuidorIntegradorSimple = (ComponenteDistribuidorIntegradorSimple) objComponenteIncluido;                    
                    strDefinicion = "private " + objComponenteDistribuidorIntegradorSimple.getName() + " obj" + objComponenteDistribuidorIntegradorSimple.getName() + ";";
                    if(!objDefiniciones.contains(strDefinicion)){
                        objDefiniciones.add(strDefinicion);
                    }
                }
                else if(objComponenteIncluido instanceof ComponenteDistribuidorIntegradorMetodo){
                    ComponenteDistribuidorIntegradorMetodo objComponenteDistribuidorIntegradorMetodo = (ComponenteDistribuidorIntegradorMetodo) objComponenteIncluido;                    
                    strDefinicion = "private " + objComponenteDistribuidorIntegradorMetodo.getName() + " obj" + objComponenteDistribuidorIntegradorMetodo.getName() + ";";
                    if(!objDefiniciones.contains(strDefinicion)){
                        objDefiniciones.add(strDefinicion);
                    }
                }
                else if(objComponenteIncluido instanceof ComponenteDistribuidorGeneradorClaseCompleja){
                    ComponenteDistribuidorGeneradorClaseCompleja objComponenteDistribuidorGeneradorClase = (ComponenteDistribuidorGeneradorClaseCompleja) objComponenteIncluido;
                    strDefinicion = "private " + objComponenteDistribuidorGeneradorClase.getName() + " obj" + objComponenteDistribuidorGeneradorClase.getName() + ";";
                    if(!objDefiniciones.contains(strDefinicion)){
                        objDefiniciones.add(strDefinicion);
                    }
                }
                else{
                    generarDefinicion(objDefiniciones, (ComponenteDistribuidor) objComponenteIncluido);
                }
            }
            else if(objComponenteIncluido instanceof ComponenteGeneradoInterno){
                strDefinicion = crearDefinicion(objComponenteIncluido);
                if(!objDefiniciones.contains(strDefinicion)){
                    objDefiniciones.add(strDefinicion);
                }
                if(GeneradorComponentes.devolverTipoColeccionModeloAsociado(objComponenteIncluido.getObjClassSwing()) == TipoColeccionModeloAsociado.eAbstractList){
                    String strScroll = "private " + Utileria.leerRecursoTexto("Utileria.coleccion.contenedor.classpath") +
                            " " + Utileria.leerRecursoTexto("Utileria.coleccion.contenedor.alias") + objComponenteIncluido.getName() + ";";
                    if(!objDefiniciones.contains(strScroll)){
                        objDefiniciones.add(strScroll);
                    }
                }
            }
            else if(objComponenteIncluido instanceof ComponenteGeneradoSimple){
                strDefinicion = crearDefinicion(objComponenteIncluido);
                if(!objDefiniciones.contains(strDefinicion)){
                    objDefiniciones.add(strDefinicion);
                }
                if(GeneradorComponentes.devolverTipoColeccionModeloAsociado(objComponenteIncluido.getObjClassSwing()) == TipoColeccionModeloAsociado.eAbstractList){
                    String strScroll = "private " + Utileria.leerRecursoTexto("Utileria.coleccion.contenedor.classpath") +
                            " " + Utileria.leerRecursoTexto("Utileria.coleccion.contenedor.alias") + objComponenteIncluido.getName();
                    if(!objDefiniciones.contains(strScroll)){
                        objDefiniciones.add(strScroll);
                    }
                }
            }
        }                
        for(Componente objComponenteIncluido : objComponenteDistribuidor.getObjDistribuidorGrupalSeleccionado().getObjComponentesDistribuidos()){
            if(objComponenteIncluido instanceof ComponenteGeneradoSimple){
                
            }
        }
    }
    
    
    
    private static ArrayList<String> generarInicializacion(ComponenteDistribuidor objComponenteDistribuidor){
        ArrayList<String> objInicializaciones = new ArrayList<String>();        
        generarInicializacion(objInicializaciones, objComponenteDistribuidor);
        return objInicializaciones;
    }
    
    private static void generarInicializacion(ArrayList<String> objInicializaciones, ComponenteDistribuidor objComponenteDistribuidor){                
        for(Componente objComponenteIncluido : objComponenteDistribuidor.getObjDistribuidorGrupalSeleccionado().getObjComponentesDistribuidos()){
            String strInicializacion;
            if(objComponenteIncluido instanceof ComponenteDistribuidor){ 
                if(objComponenteIncluido instanceof ComponenteDistribuidorIntegradorSimple){
                    ComponenteDistribuidorIntegradorSimple objComponenteDistribuidorIntegradorSimple = (ComponenteDistribuidorIntegradorSimple) objComponenteIncluido;                    
                    strInicializacion = "obj" + objComponenteDistribuidorIntegradorSimple.getName() + " = new " + objComponenteDistribuidorIntegradorSimple.getName() + TOKEN_PARENTESIS_BEANS + ";";
                    if(!objInicializaciones.contains(strInicializacion)){
                        objInicializaciones.add(strInicializacion);
                    }
                }
                else if(objComponenteIncluido instanceof ComponenteDistribuidorIntegradorMetodo){
                    ComponenteDistribuidorIntegradorMetodo objComponenteDistribuidorIntegradorMetodo = (ComponenteDistribuidorIntegradorMetodo) objComponenteIncluido;                    
                    strInicializacion = "obj" + objComponenteDistribuidorIntegradorMetodo.getName() + " = new " + objComponenteDistribuidorIntegradorMetodo.getName() + TOKEN_PARENTESIS_BEANS + ";";
                    if(!objInicializaciones.contains(strInicializacion)){
                        objInicializaciones.add(strInicializacion);
                    }
                }
                else if(objComponenteIncluido instanceof ComponenteDistribuidorGeneradorClaseCompleja){
                    ComponenteDistribuidorGeneradorClaseCompleja objComponenteDistribuidorGeneradorClase = (ComponenteDistribuidorGeneradorClaseCompleja) objComponenteIncluido;
                    strInicializacion = "obj" + objComponenteDistribuidorGeneradorClase.getName() + " = new " + objComponenteDistribuidorGeneradorClase.getName() + TOKEN_PARENTESIS_BEANS + ";";
                    if(!objInicializaciones.contains(strInicializacion)){
                        objInicializaciones.add(strInicializacion);
                    }
                }
                else{
                    generarInicializacion(objInicializaciones, (ComponenteDistribuidor) objComponenteIncluido);
                }
            }
            else if(objComponenteIncluido instanceof ComponenteGeneradoInterno){                
                if(objComponenteDistribuidor instanceof ComponenteDistribuidorGeneradorUnitario){
                    ComponenteDistribuidorGeneradorUnitario objComponenteGeneradorUnitario = (ComponenteDistribuidorGeneradorUnitario) objComponenteDistribuidor;
                    if(objComponenteGeneradorUnitario.isIntoCasoColeccion()){
                        strInicializacion = crearInicializacion(objComponenteGeneradorUnitario, objComponenteIncluido);
                        if(!objInicializaciones.contains(strInicializacion)){
                            objInicializaciones.add(strInicializacion);
                        }
                    }
                    else{
                        strInicializacion = crearInicializacion(objComponenteIncluido);
                        if(!objInicializaciones.contains(strInicializacion)){
                            objInicializaciones.add(strInicializacion);
                        }                        
                    }
                }
                else if(objComponenteDistribuidor instanceof ComponenteDistribuidorExtra){
                    ComponenteDistribuidorExtra objComponenteExtra = (ComponenteDistribuidorExtra) objComponenteDistribuidor;
                    if(objComponenteExtra.isIntoCasoColeccion()){
                        strInicializacion = crearInicializacion(objComponenteExtra, objComponenteIncluido);
                        if(!objInicializaciones.contains(strInicializacion)){
                            objInicializaciones.add(strInicializacion);
                        }
                    }
                    else{
                        strInicializacion = crearInicializacion(objComponenteIncluido);
                        if(!objInicializaciones.contains(strInicializacion)){
                            objInicializaciones.add(strInicializacion);
                        }                        
                    }
                }
                else{                
                    strInicializacion = crearInicializacion(objComponenteIncluido);
                    if(!objInicializaciones.contains(strInicializacion)){
                        objInicializaciones.add(strInicializacion);
                    }
                }
                if(GeneradorComponentes.devolverTipoColeccionModeloAsociado(objComponenteIncluido.getObjClassSwing()) == TipoColeccionModeloAsociado.eAbstractList){
                    String strScroll = Utileria.leerRecursoTexto("Utileria.coleccion.contenedor.alias") + objComponenteIncluido.getName() +
                            " = new " + Utileria.leerRecursoTexto("Utileria.coleccion.contenedor.classpath") + "();";
                    if(!objInicializaciones.contains(strScroll)){
                        objInicializaciones.add(strScroll);
                    }
                }
            }
            else if(objComponenteIncluido instanceof ComponenteGeneradoSimple){
                strInicializacion = crearInicializacion(objComponenteIncluido);
                if(!objInicializaciones.contains(strInicializacion)){
                    objInicializaciones.add(strInicializacion);
                }
                if(GeneradorComponentes.devolverTipoColeccionModeloAsociado(objComponenteIncluido.getObjClassSwing()) == TipoColeccionModeloAsociado.eAbstractList){
                    String strScroll = Utileria.leerRecursoTexto("Utileria.coleccion.contenedor.alias") + objComponenteIncluido.getName() +
                            " new " + Utileria.leerRecursoTexto("Utileria.coleccion.contenedor.classpath") + "();";
                    if(!objInicializaciones.contains(strScroll)){
                        objInicializaciones.add(strScroll);
                    }
                }
            }
        }        
    }
    
    private static ArrayList<String> generarPropiedad(ComponenteDistribuidor objComponenteDistribuidor){
        ArrayList<String> objPropiedades = new ArrayList<String>();        
        generarPropiedad(objPropiedades, objComponenteDistribuidor);
        return objPropiedades;
    }
    
    private static void generarPropiedad(ArrayList<String> objPropiedades, ComponenteDistribuidor objComponenteDistribuidor){                
        for(Componente objComponenteIncluido : objComponenteDistribuidor.getObjDistribuidorGrupalSeleccionado().getObjComponentesDistribuidos()){
            String strPropiedad;
            if(objComponenteIncluido instanceof ComponenteDistribuidorGeneradorUnitario){                
                generarPropiedad(objPropiedades, (ComponenteDistribuidor) objComponenteIncluido);
            }
            else if(objComponenteIncluido instanceof ComponenteDistribuidorGeneradorEnum){                
                generarPropiedad(objPropiedades, (ComponenteDistribuidor) objComponenteIncluido);
            }
            if(objComponenteIncluido instanceof ComponenteDistribuidorGeneradorMetodo){                
                generarPropiedad(objPropiedades, (ComponenteDistribuidor) objComponenteIncluido);
            }
            else if(objComponenteIncluido instanceof ComponenteGeneradoInterno){                
                for(Propiedad objPropiedad : objComponenteIncluido.getObjPropiedadesDisponibles()){
                    strPropiedad = crearPropiedadSet(objComponenteIncluido, objPropiedad);
                    if(!strPropiedad.isEmpty() && !objPropiedades.contains(strPropiedad)){
                        objPropiedades.add(strPropiedad);
                    }
                    if(GeneradorComponentes.devolverTipoColeccionModeloAsociado(objComponenteIncluido.getObjClassSwing()) == TipoColeccionModeloAsociado.eAbstractList){
                        String strScroll = Utileria.leerRecursoTexto("Utileria.coleccion.contenedor.alias") + objComponenteIncluido.getName() +
                            "." + Utileria.leerRecursoTexto("Utileria.coleccion.contenedor.metodo") + "(" + objComponenteIncluido.getName() +");";
                        if(!objPropiedades.contains(strScroll)){
                            objPropiedades.add(strScroll);
                        }
                    }
                }
            }
            else if(objComponenteIncluido instanceof ComponenteGeneradoSimple){
                for(Propiedad objPropiedad : objComponenteIncluido.getObjPropiedadesDisponibles()){
                    strPropiedad = crearPropiedadSet(objComponenteIncluido, objPropiedad);
                    if(!UtilRepresentacion.isPropiedadExcluida(objPropiedad.getName()) &&
                            !strPropiedad.isEmpty() &&
                            !objPropiedades.contains(strPropiedad)){
                        objPropiedades.add(strPropiedad);
                    }
                }
            }
        }        
    }
    
    private static ArrayList<String> generarDistribucion(ComponenteDistribuidor objComponenteDistribuidor){
        ArrayList<String> objDistribuciones = new ArrayList<String>();        
        generarDistribucion(objDistribuciones, objComponenteDistribuidor);
        return objDistribuciones;
    }
    
    private static void generarDistribucion(ArrayList<String> objDistribuciones, ComponenteDistribuidor objComponenteDistribuidor){                
        for(Componente objComponenteIncluido : objComponenteDistribuidor.getObjDistribuidorGrupalSeleccionado().getObjComponentesDistribuidos()){
            String strDistribucion;
            if(objComponenteIncluido instanceof ComponenteDistribuidor){
                if(objComponenteIncluido instanceof ComponenteDistribuidorIntegradorSimple){
                    ComponenteDistribuidorIntegradorSimple objComponenteDistribuidorIntegradorSimple = (ComponenteDistribuidorIntegradorSimple) objComponenteIncluido;                    
                    strDistribucion = crearGridBagConstraints(objComponenteDistribuidorIntegradorSimple);
                    if(!objDistribuciones.contains(strDistribucion)){
                        objDistribuciones.add(strDistribucion);
                    }
                }
                else if(objComponenteIncluido instanceof ComponenteDistribuidorIntegradorMetodo){
                    ComponenteDistribuidorIntegradorMetodo objComponenteDistribuidorIntegradorMetodo = (ComponenteDistribuidorIntegradorMetodo) objComponenteIncluido;                    
                    strDistribucion = crearGridBagConstraints(objComponenteDistribuidorIntegradorMetodo);
                    if(!objDistribuciones.contains(strDistribucion)){
                        objDistribuciones.add(strDistribucion);
                    }
                }
                else if(objComponenteIncluido instanceof ComponenteDistribuidorGeneradorClaseCompleja){
                    ComponenteDistribuidorGeneradorClaseCompleja objComponenteDistribuidorGeneradorClase = (ComponenteDistribuidorGeneradorClaseCompleja) objComponenteIncluido;
                    strDistribucion = crearGridBagConstraints(objComponenteDistribuidorGeneradorClase);
                    if(!objDistribuciones.contains(strDistribucion)){
                        objDistribuciones.add(strDistribucion);
                    }
                }
                else{
                    generarDistribucion(objDistribuciones, (ComponenteDistribuidor) objComponenteIncluido);
                }
            }
            else if(objComponenteIncluido instanceof ComponenteGeneradoInterno){                                
                strDistribucion = crearGridBagConstraints(objComponenteIncluido);
                if(!objDistribuciones.contains(strDistribucion)){
                    objDistribuciones.add(strDistribucion);
                }                
            }
            else if(objComponenteIncluido instanceof ComponenteGeneradoSimple){                
                strDistribucion = crearGridBagConstraints(objComponenteIncluido);
                if(!objDistribuciones.contains(strDistribucion)){
                    objDistribuciones.add(strDistribucion);
                }                
            }
        }        
    }
    
    private static String crearImport(String strClassPath){
        return "import " + strClassPath + ";";
    }
    
    private static String crearDefinicion(Componente objComponente){
        return "private " + objComponente.getStrClassPath() + " " + objComponente.getName() + ";";
    }
    
    private static String crearInicializacion(Componente objComponente){
        return objComponente.getName() + " = new " + objComponente.getStrClassPath() + TOKEN_PARENTESIS_BEANS + ";";
    }
    
    private static String crearInicializacion(ComponenteDistribuidor objComponenteDistribuidor, Componente objComponente){
        return objComponente.getName() + " = new " + objComponente.getStrClassPath() + TOKEN_PARENTESIS_BEANS + ";";
    }
    
    private static String crearPropiedadSet(Componente objComponente, Propiedad objPropiedad){
        String value = prepararPropiedadSet(objPropiedad);
        return (value.isEmpty() || value.equals("\"\"")) ? "" : objComponente.getName() + "." + objPropiedad.getSet() + "(" + value + ");";
    }
    
    private static String prepararPropiedadSet(Propiedad objPropiedad){
        String value = "";
        for(ParametroPropiedad objParametro : objPropiedad.getObjParametrosSet()){
            value += prepararParametroPropiedad(objPropiedad, objParametro) + " ,";            
        }
        return value.isEmpty() ? value : value.substring(0, value.length() - 2);
    }
    
     private static String prepararParametroPropiedad(Propiedad objPropiedad, ParametroPropiedad objParametro){
        String value;
        if(objParametro.isPrimitive()){
            value = prepararParametroPrimitivo(objPropiedad, objParametro);
        }
        else{//Es un Objeto
            value = prepararParametroObjeto(objPropiedad, objParametro);
        }        
        return value;
    }
     
    private static String prepararParametroPrimitivo(Propiedad objPropiedad, ParametroPropiedad objParametro){
        String value = "";        
        if(objParametro.isPrimitive()){
            if(!objParametro.getStrValue().isEmpty()){
                value += objParametro.getStrValue();
            }
            else if(!objParametro.getStrValueDefault().isEmpty()){
                value += objParametro.getStrValueDefault();
            }
            else{
                if(objParametro.getStrClassPath().equals("boolean")){
                    value += "false";
                }
                else if(objParametro.getStrClassPath().equals("byte")){
                    value += "0";
                }
                else if(objParametro.getStrClassPath().equals("int")){
                    value += "0";
                }
                else if(objParametro.getStrClassPath().equals("long")){
                    value += "0";
                }        
                else if(objParametro.getStrClassPath().equals("float")){
                    value += "0";
                }
                else if(objParametro.getStrClassPath().equals("double")){
                    value += "0";
                }
                else if(objParametro.getStrClassPath().equals("char")){
                    value += "'0'";
                }
            }
        }        
        return value;
    } 
    
    private static String prepararParametroObjeto(Propiedad objPropiedad, ParametroPropiedad objParametro){
        String value = "";        
        if(!objParametro.isPrimitive()){
            if(objParametro.getStrClassPath().equals(String.class.getCanonicalName())){
                value = prepararParametroObjetoString(objPropiedad, objParametro);
            }                        
            else if(objParametro.getStrClassPath().equals(Color.class.getCanonicalName())){
                value = prepararParametroObjetoColor(objPropiedad, objParametro);
            }
        }        
        return value;
    } 
    
    private static String prepararParametroObjetoString(Propiedad objPropiedad, ParametroPropiedad objParametro){
        String value;
        if(!objParametro.getStrValue().isEmpty()){
            value = "\"" + objParametro.getStrValue() + "\"";
        }
        else if(!objParametro.getStrValueDefault().isEmpty()){
            value = "\"" + objParametro.getStrValueDefault() + "\"";
        }
        else{
            value = "\"\"";
        }
        return value;
    }
    
    private static String prepararParametroObjetoColor(Propiedad objPropiedad, ParametroPropiedad objParametro){
        String value;
        if(!objParametro.getStrValue().isEmpty()){
            value = "new java.awt.Color(" + objParametro.getStrValue() + ")";
        }
        else if(!objParametro.getStrValueDefault().isEmpty()){
            value = "new java.awt.Color(" + objParametro.getStrValueDefault() + ")";
        }
        else{
            value = "new java.awt.Color(Color.BLACK)";
        }
        return value;
    }
    
    public static boolean buildPathSourceFileProperties(ArrayList<ComponenteGenerado> objComponentes){
        for(Componente objComponente : objComponentes){
            Propiedad objPropiedad = objComponente.findPropiedadForAlias("Icono");
            if(objPropiedad != null){                
                buildPathSourceFilePropertiesComponent(objComponente, objPropiedad);
            }
        }
        return true;
    }
    
    public static void buildPathSourceFilePropertiesComponent(Componente objComponente, Propiedad objPropiedad){        
        ParametroPropiedad objParametro = objPropiedad.getObjParametroDefault(Propiedad.MODO_SET);
        if(objParametro != null){
            if(objParametro.getStrValue() != null){
                String strValue = objParametro.getStrValue();
                if(!strValue.isEmpty()){
                    File objFile = new File(strValue);
                    if(objFile.isFile()){
                        objPropiedad.addSwap(objPropiedad.getName(), objFile.getName());
                    }
                }
            }
        }
    }
    
    private static String crearGridBagConstraints(Componente objComponente){        
        //GridBagConstraints objGridBagConstraints = objComponente.getGridBagConstraintsActiva();
        GridBagConstraints objGridBagConstraints = objComponente.getObjGridBagConstraintsGUI();
        return encapsularGridBagConstraints(objComponente, objGridBagConstraints);
    } 
    
    private static String encapsularGridBagConstraints(Componente objComponente, GridBagConstraints objGridBagConstraints) {
        String strComponente;
        if(GeneradorComponentes.devolverTipoColeccionModeloAsociado(objComponente.getObjClassSwing()) == TipoColeccionModeloAsociado.eAbstractList){                        
            strComponente = Utileria.leerRecursoTexto("Utileria.coleccion.contenedor.alias") + objComponente.getName();
        }
        else if(objComponente instanceof ComponenteDistribuidorIntegrador || 
                objComponente instanceof ComponenteDistribuidorGeneradorClaseCompleja){
            strComponente = "obj" + objComponente.getName();
        }
        else{
            strComponente = objComponente.getName();
        }
        return "addToLayout(" + strComponente + ", " + objGridBagConstraints.gridx + ", " +
                objGridBagConstraints.gridy + ", " + objGridBagConstraints.gridwidth + ", " +
                objGridBagConstraints.gridheight + ", " + objGridBagConstraints.weightx + ", " +
                objGridBagConstraints.weighty + ", " + objGridBagConstraints.anchor + ", " + 
                objGridBagConstraints.fill + ", " + objGridBagConstraints.insets.top + ", " +
                objGridBagConstraints.insets.left + ", " + objGridBagConstraints.insets.bottom + ", " +
                objGridBagConstraints.insets.right + ", " + objGridBagConstraints.ipadx + ", " +
                objGridBagConstraints.ipady + ");";
    }
    
    private static Map<String, String> crearEventoOyente(Componente objComponente, Oyente objOyente, EventoOyente objEvento){
        Map<String, String> objMap = new HashMap<String, String>();
        objMap.put("name", objComponente.getName());
        objMap.put("interfaz", objOyente.getStrInterfaz());
        objMap.put("paquete", objOyente.getStrPaquete());
        
        String strEvento = objEvento.getStrNombre();
        strEvento = Character.toUpperCase(strEvento.charAt(0)) + strEvento.substring(1);
        objMap.put("evento_metodo", strEvento);
        objMap.put("evento", objEvento.getStrNombre());
        objMap.put("accion", objOyente.getStrAccion());
        objMap.put("evt", objOyente.getStrVar());
        return objMap;
    }
    
    private static void crearFuncionEncapsularComponenteGeneradorUnitario(VelocityContext context, ComponenteDistribuidorGeneradorUnitario objComponenteDistribuidorGeneradorUnitario, ConfiguracionGeneradorCodigo objCFG){
        List<String> objLineas = new ArrayList<String>();
        List<ComponenteDistribuidorGeneradorClaseCompleja> objComponentes = new ArrayList<ComponenteDistribuidorGeneradorClaseCompleja>();        
        String strLinea;
        
        if(!objComponenteDistribuidorGeneradorUnitario.isGenerarEncapsulacionBeans()){
            ObjetoTipoDatoReflexion objTipoDato = objComponenteDistribuidorGeneradorUnitario.getObjTipoDato();                            
            
            if(objComponenteDistribuidorGeneradorUnitario.getObjModeloAsociado() != null){
                
                ModeloAsociado objModeloAsociado = objComponenteDistribuidorGeneradorUnitario.getObjModeloAsociado();                
                if(objModeloAsociado.geteTipoColeccion() == TipoColeccionModeloAsociado.eAbstractList){
                    
                    if(objComponenteDistribuidorGeneradorUnitario.getObjTipoDato().contieneRepresentacionesGenericas()){
                        ObjetoTipoDatoReflexion objTipoDatoGenerico = objTipoDato.getObjTiposGenericos().get(0);                    
                        String strClassPathGeneric = objTipoDatoGenerico.getClassPathCodeInto();
                        strLinea =   "public " + objTipoDato.getClassPathCodeInto() + "<" + strClassPathGeneric + "> devolverTipoDato(){\n";
                        objLineas.add(strLinea);
                        strLinea =  "return objColeccion;\n";
                        objLineas.add(strLinea);                        
                    }
                    else{
                        //propiedad
                    }
                }
                else{
                    //otro tipo de modelo pendiente
                }
            }
            else{
                //No hay Modelo Asociado
                ComponenteGeneradoInterno objComponenteGeneradoInterno = objComponenteDistribuidorGeneradorUnitario.getObjComponenteGenerador();
                strLinea =   "public " + objComponenteGeneradoInterno.getObjPropiedadBeans().getStrClassPathParametroDefaul() + " devolver" + objComponenteGeneradoInterno.getName() + "String(){\n";
                objLineas.add(strLinea);
                strLinea = "return " + objComponenteGeneradoInterno.getName() + "." + objComponenteGeneradoInterno.getObjPropiedadBase().getGet() + "();";
                objLineas.add(strLinea);
            }
            strLinea = "}\n";
            objLineas.add(strLinea);                                    
            objCFG.objFunciones.put(objComponenteDistribuidorGeneradorUnitario.getName(), objLineas);                                                  
        }
    }
    
    private static void crearFuncionEncapsularComponenteGeneradorClase(VelocityContext context, ComponenteDistribuidorGeneradorClaseCompleja objComponenteDistribuidorGeneradorClase, ConfiguracionGeneradorCodigo objCFG){
        List<String> objLineas = new ArrayList<String>();
        List<ComponenteDistribuidorGeneradorClaseCompleja> objComponentes = new ArrayList<ComponenteDistribuidorGeneradorClaseCompleja>();        
        
        if(!objComponenteDistribuidorGeneradorClase.isGenerarEncapsulacionBeans()){
            
            String strLinea = "public " + objComponenteDistribuidorGeneradorClase.getObjTipoDato().getStrClassPath() + 
                    " encapsularObj(){\n";
            objLineas.add(strLinea);
            
            strLinea = objComponenteDistribuidorGeneradorClase.getObjTipoDato().getStrClassPath() + 
                    " obj = new " + objComponenteDistribuidorGeneradorClase.getObjTipoDato().getStrClassPath() + "();\n";
            objLineas.add(strLinea);            
            
            
            List<String> objLineasCaptura = new ArrayList<String>();
            List<CastTipoDatoRepresentacionBase> objCastException = new ArrayList<CastTipoDatoRepresentacionBase>();            
            for(Componente objComponente : objComponenteDistribuidorGeneradorClase.getComponentesDistribuidos()){
                if(objComponente instanceof ComponenteDistribuidorGeneradorMetodoSetter){
                    ComponenteDistribuidorGeneradorMetodoSetter objComponenteDistribuidorGeneradorMetodoSetter = (ComponenteDistribuidorGeneradorMetodoSetter) objComponente;
                    ComponenteDistribuidorGenerador objComponenteDistribuidorGenerador = objComponenteDistribuidorGeneradorMetodoSetter.getObjComponenteGeneradorParam();
                    if(objComponenteDistribuidorGenerador instanceof ComponenteDistribuidorGeneradorUnitario){
                        ComponenteDistribuidorGeneradorUnitario objComponenteDistribuidorGeneradorUnitario = (ComponenteDistribuidorGeneradorUnitario) objComponenteDistribuidorGenerador;
                        ObjetoTipoDatoReflexion objTipoDato = objComponenteDistribuidorGeneradorUnitario.getObjTipoDato();
                        ComponenteGeneradoInterno objComponenteGeneradoInterno = objComponenteDistribuidorGeneradorUnitario.getObjComponenteGenerador();
                        PropiedadBase objPropiedadBase = objComponenteGeneradoInterno.getObjPropiedadBase();
                        String strMetodo = objComponenteDistribuidorGeneradorMetodoSetter.getStrMetodo();                        
                        CastTipoDatoRepresentacionBase objCast = GeneradorCodigoFuente.generarLineaCapturaTipoDatoParaControl(objLineasCaptura, "obj", strMetodo, objTipoDato, objComponenteGeneradoInterno, objPropiedadBase);                        
                        if(objCast != null){
                            if(!objCastException.contains(objCast)){
                                objCastException.add(objCast);
                            }
                        }
                    }                    
                }
            }
            if(!objCastException.isEmpty()){//Existen exceptions por capturar
                strLinea = "try{\n";
                objLineas.add(strLinea);
                objLineas.addAll(objLineasCaptura);
                for(CastTipoDatoRepresentacionBase objCastInterno : objCastException){
                    strLinea = "}catch(" + objCastInterno.getException() +  "){\n\t";
                    strLinea += "javax.swing.JOptionPane.showMessageDialog(null" +
                                ", \"" + objCastInterno.getMessage() + "\");\nreturn null;\n}";
                    objLineas.add(strLinea);
                }
                strLinea = "\n";
                objLineas.add(strLinea);                
            }
            else{
                objLineas.addAll(objLineasCaptura);
            }            
            strLinea = "return obj;\n";
            objLineas.add(strLinea);                                    
            strLinea = "}\n";
            objLineas.add(strLinea);                                    
            objCFG.objFunciones.put(objComponenteDistribuidorGeneradorClase.getName(), objLineas);            
            for(ComponenteDistribuidorGeneradorClaseCompleja objComponente : objComponentes){
                crearFuncionEncapsularComponenteGeneradorClase(context, objComponente, objCFG);                
            }  
        }
        else if(objComponenteDistribuidorGeneradorClase.isGenerarEncapsulacionBeans()){
            ComponenteBeans objComponenteBeans = objComponenteDistribuidorGeneradorClase.getObjComponenteBeans();        
            String strLinea = "public " + objComponenteBeans.getName() + " encapsularModeloAsociado(){";
            objLineas.add(strLinea);
            for(Componente objComponente : objComponenteDistribuidorGeneradorClase.getObjComponentes()){
                //Se evalua el tipo de Componente
                if(objComponente instanceof ComponenteDistribuidorGeneradorMetodoSetter){
                    ComponenteDistribuidorGeneradorMetodoSetter objComponenteDistribuidorGeneradorMetodoSetter = (ComponenteDistribuidorGeneradorMetodoSetter) objComponente;
                    ComponenteDistribuidorGenerador objCDG = objComponenteDistribuidorGeneradorMetodoSetter.getObjComponenteGeneradorParam();
                    if(objCDG instanceof ComponenteDistribuidorGeneradorUnitario){
                        ComponenteDistribuidorGeneradorUnitario objComponenteDistribuidorGeneradorUnitario = (ComponenteDistribuidorGeneradorUnitario) objCDG;
                        ComponenteGeneradoInterno objComponenteGeneradoInterno = objComponenteDistribuidorGeneradorUnitario.getObjComponenteGenerador();
                        strLinea = crearLineaEncapsulacionPropiedadBeans(objComponenteGeneradoInterno, objComponenteBeans, objComponenteGeneradoInterno.getObjPropiedadBeans());
                        objLineas.add(strLinea);                    
                    }
                    else if(objCDG instanceof ComponenteDistribuidorGeneradorClaseCompleja){
                        ComponenteDistribuidorGeneradorClaseCompleja objCDGC = (ComponenteDistribuidorGeneradorClaseCompleja) objCDG;
                        ComponenteBeans objComponenteBeansCDGC = objCDGC.getObjComponenteBeans();
                        //Se evalua una definicion previa
                        strLinea = crearLineaEncapsulacionComponenteBeans(objComponenteBeans, objComponenteBeansCDGC);
                        objLineas.add(strLinea);                    
                        if(!objCFG.objFunciones.containsKey(objComponenteBeansCDGC.getName())){
                            objComponentes.add((ComponenteDistribuidorGeneradorClaseCompleja) objCDG);
                        }
                    }
                }                
                else if(objComponente instanceof ComponenteDistribuidorGeneradorMetodoGetter){
                    ComponenteDistribuidorGeneradorMetodoGetter objComponenteDistribuidorGeneradorMetodoGetter = (ComponenteDistribuidorGeneradorMetodoGetter) objComponente;
                    ComponenteDistribuidorGenerador objCDG = objComponenteDistribuidorGeneradorMetodoGetter.getObjComponenteGeneradorReturn();
                    if(objCDG instanceof ComponenteDistribuidorGeneradorUnitario){
                        ComponenteDistribuidorGeneradorUnitario objComponenteDistribuidorGeneradorUnitario = (ComponenteDistribuidorGeneradorUnitario) objCDG;
                        ComponenteGeneradoInterno objComponenteGeneradoInterno = objComponenteDistribuidorGeneradorUnitario.getObjComponenteGenerador();
                        strLinea = crearLineaEncapsulacionPropiedadBeans(objComponenteGeneradoInterno, objComponenteBeans, objComponenteGeneradoInterno.getObjPropiedadBeans());
                        objLineas.add(strLinea);                    
                    }
                    else if(objCDG instanceof ComponenteDistribuidorGeneradorClaseCompleja){
                        ComponenteDistribuidorGeneradorClaseCompleja objCDGC = (ComponenteDistribuidorGeneradorClaseCompleja) objCDG;
                        ComponenteBeans objComponenteBeansCDGC = objCDGC.getObjComponenteBeans();
                        //Se evalua una definicion previa
                        strLinea = crearLineaEncapsulacionComponenteBeans(objComponenteBeans, objComponenteBeansCDGC);
                        objLineas.add(strLinea);                    
                        if(!objCFG.objFunciones.containsKey(objComponenteBeansCDGC.getName())){
                            objComponentes.add((ComponenteDistribuidorGeneradorClaseCompleja) objCDG);
                        }
                    }
                }  
            }
            objCFG.objFunciones.put(objComponenteBeans.getName(), objLineas);            
            for(ComponenteDistribuidorGeneradorClaseCompleja objComponente : objComponentes){
                crearFuncionEncapsularComponenteGeneradorClase(context, objComponente, objCFG);                
            }            
        }
    }
    
    private static void crearFuncionEncapsularComponenteIntegradorExtra(VelocityContext context, ComponenteDistribuidorIntegradorExtra objComponenteDistribuidorIntegradorExtra, ConfiguracionGeneradorCodigo objCFG){
        List<String> objLineas = new ArrayList<String>();
        List<ComponenteDistribuidorIntegradorExtra> objComponentes = new ArrayList<ComponenteDistribuidorIntegradorExtra>();        
        ComponenteBeans objComponenteBeans = objComponenteDistribuidorIntegradorExtra.getObjComponenteBeans();
            
        String strLinea = "public " + objComponenteBeans.getName() + 
                " encapsular" + objComponenteBeans.getName() + "(){\n";
        objLineas.add(strLinea);

        strLinea = objComponenteBeans.getName() + 
                " obj = new " + objComponenteBeans.getName() + "();\n";
        objLineas.add(strLinea);            
        
        

        for(Componente objComponente : objComponenteDistribuidorIntegradorExtra.getComponentesDistribuidos()){
            if(objComponente instanceof ComponenteDistribuidorExtra){                
                ComponenteDistribuidorExtra objComponenteDistribuidorExtra = (ComponenteDistribuidorExtra) objComponente;                
                ComponenteBeans objComponenteBeansExtra = objComponenteDistribuidorExtra.getObjComponenteBeans();
                ComponenteGeneradoInterno objComponenteGeneradoInterno = objComponenteDistribuidorExtra.getObjComponenteGenerador();
                PropiedadBase objPropiedadBase = objComponenteGeneradoInterno.getObjPropiedadBase();
                strLinea = "obj.set" + objComponenteGeneradoInterno.getName() + "(" + 
                    objComponenteGeneradoInterno.getName() + "." + objPropiedadBase.getGet() + "());\n";
                objLineas.add(strLinea);                                                    
            }
            else if(objComponente instanceof ComponenteDistribuidorIntegradorExtra){                
                ComponenteDistribuidorIntegradorExtra objComponenteDistribuidorIntegradorExtraInterno = (ComponenteDistribuidorIntegradorExtra) objComponente;                                
                ComponenteBeans objComponenteBeansIntegradorExtra = objComponenteDistribuidorIntegradorExtraInterno.getObjComponenteBeans();
                strLinea = "obj." + objComponenteDistribuidorIntegradorExtraInterno.getName() + "(" + 
                    "encapsular" + objComponenteDistribuidorIntegradorExtraInterno.getName() + "());\n";
                objLineas.add(strLinea); 
                objComponentes.add(objComponenteDistribuidorIntegradorExtraInterno);
            }
        }
        strLinea = "return obj;\n";        
        objLineas.add(strLinea);                                    
        strLinea = "}\n";
        objLineas.add(strLinea);                                    
        objCFG.objFunciones.put(objComponenteDistribuidorIntegradorExtra.getName(), objLineas);            
        for(ComponenteDistribuidorIntegradorExtra objComponente : objComponentes){
            crearFuncionEncapsularComponenteIntegradorExtra(context, objComponente, objCFG);                
        }          
    }
    
    private static String crearLineaEncapsulacionComponenteBeans(ComponenteBeans objComponenteBeansParent, ComponenteBeans objComponenteBeans){
        String strLinea = objComponenteBeansParent.getName();
        strLinea += ".set" + objComponenteBeans.getName();
        strLinea += "(encapsular" + objComponenteBeans.getName() + "());\n" ;
        return strLinea;                
    }
    
    private static String crearLineaEncapsulacionPropiedadBeans(ComponenteGenerado objComponenteGenerado, ComponenteBeans objComponenteBeansParent, PropiedadBeans objPropiedadBeans){
        String strLinea = objComponenteBeansParent.getName();
        strLinea += "." + objPropiedadBeans.getStrName();
        strLinea += "(" + objComponenteGenerado.getName() + ".";
        strLinea += objComponenteGenerado.getObjPropiedadBase().getGet();
        strLinea += "());\n" ;
        return strLinea;                
    }
    
    /**
     * 
     * @param context
     * @param objComponente
     * @param objCFG
     * @return
     */
    public static boolean crearFuncionEncapsularComponente(VelocityContext context, Componente objComponente, ConfiguracionGeneradorCodigo objCFG){
        if(objComponente instanceof ComponenteDistribuidorIntegradorExtra){                
            crearFuncionEncapsularComponenteIntegradorExtra(context, (ComponenteDistribuidorIntegradorExtra) objComponente, objCFG);
            return true;
        }
        if(objComponente instanceof ComponenteDistribuidorGeneradorUnitario){                
            crearFuncionEncapsularComponenteGeneradorUnitario(context, (ComponenteDistribuidorGeneradorUnitario) objComponente, objCFG);
            return true;
        }
        else if(objComponente instanceof ComponenteDistribuidorGeneradorClaseCompleja){                
            crearFuncionEncapsularComponenteGeneradorClase(context, (ComponenteDistribuidorGeneradorClaseCompleja) objComponente, objCFG);
            return true;
        }
        return false;
    }
    
    /**
     * 
     * @param objLinea
     * @param strParent
     * @param strMetodo
     * @param objTipoDato
     * @param objComponenteGeneradoInterno
     * @param objPropiedadBase
     * @return
     */
    public static CastTipoDatoRepresentacionBase generarLineaCapturaTipoDatoParaControl(List<String> objLinea, String strParent, String strMetodo, ObjetoTipoDatoReflexion objTipoDato, ComponenteGeneradoInterno objComponenteGeneradoInterno, PropiedadBase objPropiedadBase){        
      try{
        String strLinea;
        if(objTipoDato.getObjCaso().geteCaso() == TipoCaso.ePrimitivo ||
                objTipoDato.getObjCaso().geteCaso() == TipoCaso.eJDKRegistrado){            
            String strClassPathPropiedadBase = objPropiedadBase.getObjParametroDefault(Propiedad.MODO_SET).getStrClassPath();
            if(objTipoDato.getStrClassPath().equals(strClassPathPropiedadBase)){
                strLinea = strParent + "." + strMetodo + "(" + objComponenteGeneradoInterno.getName() + "." + objPropiedadBase.getGet() + "());";
                objLinea.add(strLinea);
                return null;
            }
            else if(GeneradorComponentes.aplicaCast(objTipoDato, strClassPathPropiedadBase)){                
                CastTipoDatoRepresentacionBase objCastTipoDatoRepresentacionBase = GeneradorComponentes.devolverCast(objTipoDato, strClassPathPropiedadBase);
                if(objCastTipoDatoRepresentacionBase != null){
                    if(!objCastTipoDatoRepresentacionBase.getException().isEmpty()){
                        strLinea = strParent + "." + strMetodo + "(" + objCastTipoDatoRepresentacionBase.getFormatinit() + 
                            objComponenteGeneradoInterno.getName() + "." + objPropiedadBase.getGet() + "()" +
                            objCastTipoDatoRepresentacionBase.getFormatend() + ");";
                        objLinea.add(strLinea);
                        return objCastTipoDatoRepresentacionBase;
                    }
                    else{
                        strLinea = strParent + "." + strMetodo + "(" + objCastTipoDatoRepresentacionBase.getFormatinit() + 
                            objComponenteGeneradoInterno.getName() + "." + objPropiedadBase.getGet() + "()" +
                            objCastTipoDatoRepresentacionBase.getFormatend() + ");";
                        objLinea.add(strLinea);
                        return null;
                    }
                }
            }
        }        
        return null;
    }catch(java.lang.NullPointerException ex){}
      return null;
    }
    
    /**
     * 
     * @param objLinea
     * @param objTipoDato
     * @param objComponenteGeneradoInterno
     * @param objPropiedadBase
     * @return
     */
    public static CastTipoDatoRepresentacionBase generarLineaCapturaTipoDatoParaFuncion(List<String> objLinea, ObjetoTipoDatoReflexion objTipoDato, ComponenteGeneradoInterno objComponenteGeneradoInterno, PropiedadBase objPropiedadBase){        
      try{
        String strLinea;
        if(objTipoDato.getObjCaso().geteCaso() == TipoCaso.ePrimitivo ||
                objTipoDato.getObjCaso().geteCaso() == TipoCaso.eJDKRegistrado){            
            String strClassPathPropiedadBase = objPropiedadBase.getObjParametroDefault(Propiedad.MODO_SET).getStrClassPath();
            if(objTipoDato.getStrClassPath().equals(strClassPathPropiedadBase)){
                strLinea = "return " + objComponenteGeneradoInterno.getName() + "." + objPropiedadBase.getGet() + "();";
                objLinea.add(strLinea);
                return null;
            }
            else if(GeneradorComponentes.aplicaCast(objTipoDato, strClassPathPropiedadBase)){                
                CastTipoDatoRepresentacionBase objCastTipoDatoRepresentacionBase = GeneradorComponentes.devolverCast(objTipoDato, strClassPathPropiedadBase);
                if(objCastTipoDatoRepresentacionBase != null){
                    if(!objCastTipoDatoRepresentacionBase.getException().isEmpty()){
                        strLinea = "return " + objCastTipoDatoRepresentacionBase.getFormatinit() + 
                            objComponenteGeneradoInterno.getName() + "." + objPropiedadBase.getGet() + "()" +
                            objCastTipoDatoRepresentacionBase.getFormatend() + ";";
                        objLinea.add(strLinea);
                        return objCastTipoDatoRepresentacionBase;
                    }
                    else{
                        strLinea = "return " + objCastTipoDatoRepresentacionBase.getFormatinit() + 
                            objComponenteGeneradoInterno.getName() + "." + objPropiedadBase.getGet() + "()" +
                            objCastTipoDatoRepresentacionBase.getFormatend() + ";";
                        objLinea.add(strLinea);
                        return null;
                    }
                }
            }
        }        
        return null;
    }catch(java.lang.NullPointerException ex){}
      return null;
    }
    
    private static void crearFuncionesEncapsularReturnTipoDatoComponenteDistribuidor(ComponenteDistribuidor objComponenteDistribuidor, ConfiguracionGeneradorCodigo objCFG){
        if(objComponenteDistribuidor instanceof ComponenteDistribuidorGeneradorClaseCompleja){
            MyMap objMapasFunciones = new MyMap();
            crearFuncionesEncapsularReturnTipoDatoComponenteDistribuidorGeneradorClase(objMapasFunciones, (ComponenteDistribuidorGeneradorClaseCompleja) objComponenteDistribuidor);
            if(!objMapasFunciones.isEmpty()){
                objCFG.objMapaFunciones.put(objComponenteDistribuidor.getName(), objMapasFunciones);
            }
        }
        else if(objComponenteDistribuidor instanceof ComponenteDistribuidorIntegrador){
            MyMap objMapasFunciones = new MyMap();
            crearFuncionesEncapsularReturnTipoDatoComponenteDistribuidorIntegrador(objMapasFunciones, (ComponenteDistribuidorIntegrador) objComponenteDistribuidor);
            if(!objMapasFunciones.isEmpty()){
                objCFG.objMapaFunciones.put(objComponenteDistribuidor.getName(), objMapasFunciones);
            }
        }
    }
    
    private static void crearFuncionesEncapsularReturnTipoDatoComponenteDistribuidorIntegrador(MyMap objMapasFunciones, ComponenteDistribuidorIntegrador objComponenteDistribuidorIntegrador){                
        for(Componente objComponente : objComponenteDistribuidorIntegrador.getComponentesDistribuidos()){
            if(objComponente instanceof ComponenteDistribuidorGeneradorClaseCompleja){
                ComponenteDistribuidorGeneradorClaseCompleja objComponenteDistribuidorGeneradorClase = (ComponenteDistribuidorGeneradorClaseCompleja) objComponente;
                List<String> objLineas = new ArrayList<String>();                                
                ObjetoTipoDatoReflexion objTipoDato = objComponenteDistribuidorGeneradorClase.getObjTipoDato();                
                String strNombreTipoDato = objTipoDato.getObjClass().getSimpleName();
                strNombreTipoDato = Utileria.getKamelCaseCapital(strNombreTipoDato);
                //Se crea la definicion del metodo
                String strLinea = "public " + objComponenteDistribuidorGeneradorClase.getObjTipoDato().getStrClassPath() + 
                        " getTipoDato" + strNombreTipoDato + objComponenteDistribuidorGeneradorClase.getName() + "(){";                
                objLineas.add(strLinea);    
                //modificacion se ignora el obejto local this
                strLinea = "return obj" + objComponenteDistribuidorGeneradorClase.getName() + ".encapsularObj();\n";
                objLineas.add(strLinea);                                                     
                strLinea = "}\n";
                objLineas.add(strLinea);                                    
                objMapasFunciones.put(objComponenteDistribuidorGeneradorClase.getName(), objLineas);
            }
            else if(objComponente instanceof ComponenteDistribuidorGeneradorUnitario ||
                    objComponente instanceof ComponenteDistribuidorGeneradorEnum){
                crearFuncionesEncapsularReturnTipoDatoComponenteDistribuidorGenerador(objMapasFunciones, objComponenteDistribuidorIntegrador, (ComponenteDistribuidorGenerador) objComponente);
            }
        }
    }   
    
    private static void crearFuncionesEncapsularReturnTipoDatoComponenteDistribuidorGeneradorClase(MyMap objMapasFunciones, ComponenteDistribuidorGeneradorClaseCompleja objComponenteDistribuidorGeneradorClase){        
        for(Componente objComponente : objComponenteDistribuidorGeneradorClase.getComponentesDistribuidos()){
            if(objComponente instanceof ComponenteDistribuidorGeneradorMetodo){
                crearFuncionesEncapsularReturnTipoDatoComponenteDistribuidorGeneradorMetodo(objMapasFunciones, objComponenteDistribuidorGeneradorClase, (ComponenteDistribuidorGeneradorMetodo) objComponente);
            }
        }
    }
    
    private static void crearFuncionesEncapsularReturnTipoDatoComponenteDistribuidorGeneradorMetodo(MyMap objMapasFunciones, ComponenteDistribuidorGeneradorClaseCompleja objComponenteDistribuidorGeneradorClase, ComponenteDistribuidorGeneradorMetodo objComponenteDistribuidorGeneradorMetodo){
        for(Componente objComponente : objComponenteDistribuidorGeneradorMetodo.getComponentesDistribuidos()){            
            if(objComponente instanceof ComponenteDistribuidorGeneradorUnitario){
                ComponenteDistribuidorGeneradorUnitario objComponenteDistribuidorGeneradorUnitario = (ComponenteDistribuidorGeneradorUnitario) objComponente;
                crearFuncionesEncapsularReturnTipoDatoComponenteDistribuidorGenerador(objMapasFunciones, objComponenteDistribuidorGeneradorClase, objComponenteDistribuidorGeneradorUnitario);
            }
            else if(objComponente instanceof ComponenteDistribuidorGeneradorEnum){
                ComponenteDistribuidorGeneradorEnum objComponenteDistribuidorGeneradorEnum = (ComponenteDistribuidorGeneradorEnum) objComponente;
                crearFuncionesEncapsularReturnTipoDatoComponenteDistribuidorGenerador(objMapasFunciones, objComponenteDistribuidorGeneradorClase, objComponenteDistribuidorGeneradorEnum);
            }
            else if(objComponente instanceof ComponenteDistribuidorGeneradorClaseCompleja){
                List<String> objLineas = new ArrayList<String>();                
                ComponenteDistribuidorGeneradorClaseCompleja objComponenteDistribuidorGeneradorClaseInterna = (ComponenteDistribuidorGeneradorClaseCompleja) objComponente;
                ObjetoTipoDatoReflexion objTipoDato = objComponenteDistribuidorGeneradorClaseInterna.getObjTipoDato();                
                String strNombreTipoDato = objTipoDato.getObjClass().getSimpleName();
                strNombreTipoDato = Utileria.getKamelCaseCapital(strNombreTipoDato);
                //Se crea la definicion del metodo
                String strLinea = "public " + objComponenteDistribuidorGeneradorClaseInterna.getObjTipoDato().getStrClassPath() + 
                        " getTipoDato" + strNombreTipoDato + objComponenteDistribuidorGeneradorClase.getName() + "(){";                
                objLineas.add(strLinea);                
                strLinea = "return obj" + objComponenteDistribuidorGeneradorClaseInterna.getName() + ".encapsularObj();\n";
                objLineas.add(strLinea);                                                     
                strLinea = "}\n";
                objLineas.add(strLinea);                                    
                objMapasFunciones.put(objComponenteDistribuidorGeneradorClaseInterna.getName(), objLineas);
            }
        }
    }
    
    private static void crearFuncionesEncapsularReturnTipoDatoComponenteDistribuidorGenerador(MyMap objMapasFunciones, ComponenteDistribuidor objComponenteDistribuidor, ComponenteDistribuidorGenerador objComponenteDistribuidorGenerador){
        List<String> objLineas = new ArrayList<String>();
        List<String> objLineasCaptura = new ArrayList<String>();            
        if(objComponenteDistribuidorGenerador instanceof ComponenteDistribuidorGeneradorUnitario){
            ComponenteDistribuidorGeneradorUnitario objComponenteDistribuidorGeneradorUnitario = (ComponenteDistribuidorGeneradorUnitario) objComponenteDistribuidorGenerador;
            ObjetoTipoDatoReflexion objTipoDato = objComponenteDistribuidorGeneradorUnitario.getObjTipoDato();                
            String strNombreTipoDato;
            if(objTipoDato.getObjCaso().geteCaso() == TipoCaso.ePrimitivo){
                strNombreTipoDato = objTipoDato.getStrClassPath();
            }
            else{
                strNombreTipoDato = objTipoDato.getObjClass().getSimpleName();
            }
            strNombreTipoDato = Utileria.getKamelCaseCapital(strNombreTipoDato);
            //Se crea la definicion del metodo
            String strLinea = "public " + objComponenteDistribuidorGeneradorUnitario.getObjTipoDato().getStrClassPath() + 
                    " getTipoDato" + strNombreTipoDato + objComponenteDistribuidorGenerador.getName() + "(){";                
            objLineas.add(strLinea);
            //Evaluamos el Cast para el tipo por medio de la propiedad default del componente generado interno
            ComponenteGeneradoInterno objComponenteGeneradoInterno = objComponenteDistribuidorGeneradorUnitario.getObjComponenteGenerador();
            PropiedadBase objPropiedadBase = objComponenteGeneradoInterno.getObjPropiedadBase();                
            CastTipoDatoRepresentacionBase objCast = GeneradorCodigoFuente.generarLineaCapturaTipoDatoParaFuncion(objLineasCaptura, objTipoDato, objComponenteGeneradoInterno, objPropiedadBase);                        
            if(objCast != null){                    
                strLinea = "try{\n";
                objLineas.add(strLinea);
                objLineas.addAll(objLineasCaptura);
                strLinea = "}catch(" + objCast.getException() +  "){\n\t";
                strLinea += "javax.swing.JOptionPane.showMessageDialog(null" +
                            ", \"" + objCast.getMessage() + "\");\n}";
                objLineas.add(strLinea);
                strLinea = "\n";
                objLineas.add(strLinea);                
                
                if(objTipoDato.getObjCaso().geteCaso() == TipoCaso.ePrimitivo){
                    if(objTipoDato.getStrClassPath().equals("boolean")){
                        strLinea = "return false;\n";
                        objLineas.add(strLinea);                                    
                    }
                    else if(objTipoDato.getStrClassPath().equals("byte")){
                        strLinea = "return 0;\n";
                        objLineas.add(strLinea);                                    
                    }
                    else if(objTipoDato.getStrClassPath().equals("int")){
                        strLinea = "return -1;\n";
                        objLineas.add(strLinea);                                    
                    }
                    else if(objTipoDato.getStrClassPath().equals("long")){
                        strLinea = "return -1;\n";
                        objLineas.add(strLinea);                                    
                    }        
                    else if(objTipoDato.getStrClassPath().equals("float")){
                        strLinea = "return -1;\n";
                        objLineas.add(strLinea);                                    
                    }
                    else if(objTipoDato.getStrClassPath().equals("double")){
                        strLinea = "return -1;\n";
                        objLineas.add(strLinea);                                    
                    }
                    else if(objTipoDato.getStrClassPath().equals("char")){
                        strLinea = "return -1;\n";
                        objLineas.add(strLinea);                                    
                    }
                }
                else{
                    strLinea = "return null;\n";
                    objLineas.add(strLinea);                                    
                }
            }
            else{
                objLineas.addAll(objLineasCaptura);
            }
                            
            strLinea = "}\n";
            objLineas.add(strLinea);             
            if(!objLineasCaptura.isEmpty()){//Solo si existe lienas que encapsular
                objMapasFunciones.put(objComponenteDistribuidorGeneradorUnitario.getName(), objLineas);
            }
            
//            if(objComponenteDistribuidorGeneradorUnitario.getObjModeloAsociado() != null){
//                ObjetoTipoDatoReflexion objTipoDatoModelo = objComponenteDistribuidorGeneradorUnitario.getObjTipoDato();
//                ModeloAsociado objModeloAsociado = objComponenteDistribuidorGeneradorUnitario.getObjModeloAsociado();
//                if(objModeloAsociado.geteTipoColeccion() == TipoColeccionModeloAsociado.eAbstractList){                    
//                    String strClassPath = objTipoDatoModelo.getStrClassPath();
//                    ComponenteGeneradoInterno objComponenteGeneradoInternoModelo = objComponenteDistribuidorGeneradorUnitario.getObjComponenteGenerador();
//                    if(objTipoDatoModelo.contieneRepresentacionesGenericas()){
//                        strClassPath += objTipoDatoModelo.getClassTypesGeneric(false);
//                    }
//                    else{                                
//                        strClassPath += "<" + objComponenteGeneradoInternoModelo.getObjPropiedadBeans().getStrClassPathParametroDefaul() + ">";
//                    }
//                    ArrayList<String> objLineasModelos = new ArrayList<String>();
//                    String strDefModel = "private " + strClassPath + " devolverColeccion" + objComponenteGeneradoInternoModelo.getName() + "(){\n" +
//                            "return objColeccion" + objComponenteGeneradoInternoModelo.getName() + ";}";                    
//                    objLineasModelos.addSourceCode(strDefModel);
//                    objMapasFunciones.put(objComponenteGeneradoInternoModelo.getName(), objLineasModelos);
//                }
//            }
        }            
        else if(objComponenteDistribuidorGenerador instanceof ComponenteDistribuidorGeneradorEnum){
            ComponenteDistribuidorGeneradorEnum objComponenteDistribuidorGeneradorEnum = (ComponenteDistribuidorGeneradorEnum) objComponenteDistribuidorGenerador;
            ObjetoTipoDatoReflexion objTipoDato = objComponenteDistribuidorGeneradorEnum.getObjTipoDato();                
            String strNombreTipoDato = objTipoDato.getObjClass().getSimpleName();
            strNombreTipoDato = Utileria.getKamelCaseCapital(strNombreTipoDato);
            //Se crea la definicion del metodo
            String strLinea = "public " + objComponenteDistribuidorGeneradorEnum.getObjTipoDato().getStrClassPath() + 
                    " getTipoDato" + strNombreTipoDato + objComponenteDistribuidorGenerador.getName() + "(){";                
            objLineas.add(strLinea);
            //Evaluamos el Cast para el tipo por medio de la propiedad default del componente generado interno
            ComponenteGeneradoInterno objComponenteGeneradoInterno = objComponenteDistribuidorGeneradorEnum.getObjComponenteGenerador();
            PropiedadBase objPropiedadBase = objComponenteGeneradoInterno.getObjPropiedadBase();                
            CastTipoDatoRepresentacionBase objCast = GeneradorCodigoFuente.generarLineaCapturaTipoDatoParaFuncion(objLineasCaptura, objTipoDato, objComponenteGeneradoInterno, objPropiedadBase);                        
            if(objCast != null){                    
                strLinea = "try{\n";
                objLineas.add(strLinea);
                objLineas.addAll(objLineasCaptura);
                strLinea = "}catch(" + objCast.getException() +  "){\n\t";
                strLinea += "javax.swing.JOptionPane.showMessageDialog(null" +
                            ", \"" + objCast.getMessage() + "\");\nreturn null;\n}";
                objLineas.add(strLinea);
                strLinea = "\n";
                objLineas.add(strLinea);                
                
                if(objTipoDato.getObjCaso().geteCaso() == TipoCaso.ePrimitivo){
                    if(objTipoDato.getStrClassPath().equals("boolean")){
                        strLinea = "return false;\n";
                        objLineas.add(strLinea);                                    
                    }
                    else if(objTipoDato.getStrClassPath().equals("byte")){
                        strLinea = "return 0;\n";
                        objLineas.add(strLinea);                                    
                    }
                    else if(objTipoDato.getStrClassPath().equals("int")){
                        strLinea = "return -1;\n";
                        objLineas.add(strLinea);                                    
                    }
                    else if(objTipoDato.getStrClassPath().equals("long")){
                        strLinea = "return -1;\n";
                        objLineas.add(strLinea);                                    
                    }        
                    else if(objTipoDato.getStrClassPath().equals("float")){
                        strLinea = "return -1;\n";
                        objLineas.add(strLinea);                                    
                    }
                    else if(objTipoDato.getStrClassPath().equals("double")){
                        strLinea = "return -1;\n";
                        objLineas.add(strLinea);                                    
                    }
                    else if(objTipoDato.getStrClassPath().equals("char")){
                        strLinea = "return -1;\n";
                        objLineas.add(strLinea);                                    
                    }

                }
                else{
                    strLinea = "return null;\n";
                    objLineas.add(strLinea);                                    
                }
            }
            else{
                objLineas.addAll(objLineasCaptura);
            }
                            
            strLinea = "}\n";
            objLineas.add(strLinea);                                    
            if(!objLineasCaptura.isEmpty()){//Solo si existe lienas que encapsular
                objMapasFunciones.put(objComponenteDistribuidorGeneradorEnum.getName(), objLineas);
            }
        }        
    }    

    /**
     * Ejecuta la Opción de Inclusión de los recursos utilizados en el directorio
     * del proyecto.
     * @param objCFG Objeto Global de Configuración de Generación de Proyecto.
     * @return Estado del Proceso.
     */
    public static boolean generateProjectOptionAddResources(ConfiguracionGeneradorCodigo objCFG) {        
        ArrayList<ComponenteGenerado> objComponentes = 
                UtilRepresentacion.objBibliotecaTrabajoLocal.getComponentesWithResourceImage();
        if(!objComponentes.isEmpty()){//Existen Componentes con Recursos.                    
            return incluirRecursos(objCFG, objComponentes);
        }        
        return false;
    }

    /**
     * Ejecuta la Opción de compresión del proyecto en formato .zip.
     * @param objCFG Objeto Global de Configuración de Generación de Proyecto.
     * @return Estado del Proceso.
     */
    public static boolean generateProjectOptionCompressZip(ConfiguracionGeneradorCodigo objCFG) {        
        try {
            Utileria.makeZip(objCFG.strPathProyecto + Utileria.separador + objCFG.strNombreProyecto);            
            return true;
        } catch (IOException ex) {
            Logger.getLogger(GeneradorCodigoFuente.class.getName()).log(Level.SEVERE, null, ex);
        }
        return false;
    }
}
